Сосредоточьтесь на следующем действительном ключевом представлении на iPhone - PullRequest
9 голосов
/ 14 июля 2010

Существует ли iPhone эквивалент для NSResponder методов -selectNextKeyView или -nextValidKeyView из Mac OS X?Я знаю о методе -becomeFirstResponder, но выяснение того, какое представление вызывать, не очень красиво, когда иерархии представлений усложняются.

Должен быть какой-то способ выяснить это, как при нажатииВкладка, когда в iPhone Simulator, фокус действительно переходит к следующей UITextField.Это заставило меня задуматься, что именно происходит, когда я нажимаю клавишу Tab.Любые идеи?

Обновление : Это именно то, что я хочу, но _nextKeyResponder является частным API, так что нет-нет.Есть ли способ сделать «поддельное» нажатие клавиши табуляции без использования частного API?

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // Try to find next responder
    UIView *nextResponder = (UIView *)[self.view _nextKeyResponder];

    if (nextResponder) {
        // Found next responder, so set it.
        [nextResponder becomeFirstResponder];
        [self.tableView scrollRectToVisible:[self.tableView convertRect:[nextResponder frame] fromView:nextResponder] animated:YES];
    } else {
        // Not found, so remove keyboard.
        [textField resignFirstResponder];
    }
    return NO; // We do not want UITextField to insert line-breaks.
}

Ответы [ 3 ]

11 голосов
/ 30 мая 2011

Не существует общедоступного эквивалента iOS для NSResponder -selectKeyView или -nextValidKeyView.

Когда первый респондент является экземпляром UITextField, нажатие клавиши tab создает частный подкласс UIEvent, который передается в -[UIApplication sendEvent:], что, в свою очередь, вызывает -[UIView _nextKeyResponder].

-[UIView _nextKeyResponder] не работает так, как вы думаете. Он рассматривает цепочку ключевых представлений как цикл, поэтому ваш блок else никогда не будет достигнут. По той же причине, даже если бы был публичный API для синтеза событий клавиатуры, вы, вероятно, не захотите его использовать.

Вместо этого вы, вероятно, хотите что-то более похожее на UIWebView вспомогательное средство ввода формы на основе UIToolbar. Его кнопки можно включать и отключать при необходимости, а его делегат обрабатывает фактические действия нажатия кнопки.

Однако для реализации такого делегата в общем случае было бы полезно взглянуть на , как реализовано -[UIView _nextKeyResponder] .

0 голосов
/ 13 ноября 2012

Я удивлен, что никто другой, похоже, не решил эту проблему на iOS.

Я разработал решение, которое обрабатывает и Tab, и Shift + Tab, чтобы перемещаться вперед и назад в любое поле на iOS и не использует частные API.

Вот описание: http://weaklyreferenced.wordpress.com/2012/11/13/responding-to-the-tab-and-shift-tab-keys-on-ios-5-ios-6-with-an-external-keyboard/

0 голосов
/ 14 июля 2010

В UITextField делегате -textFieldDidEndEditing: переключайтесь между различными текстовыми полями (например, проверяя свойство tag текстового поля).

Когда вы соответствуете одному текстовому полю, установите другое текстовое поле или другой элемент управления, чтобы стать следующим респондентом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...