Существует гораздо более элегантное решение, которое поразило меня, когда я впервые увидел его. Льготы:
- Ближе к реализации текстового поля OSX, где текстовое поле знает, куда направить фокус
- Не полагается на установку или использование тегов - которые являются IMO хрупкими для этого случая использования
- Может быть продлен на работу с обоими
UITextField
и UITextView
управления - или любой клавиатурой ввода управления пользовательского интерфейса
- Не загромождает ваш контроллер представления стандартным кодом делегата UITextField
- Прекрасно интегрируется с IB и может быть настроен с помощью привычной опции-drag-drop для подключения розеток.
Создайте подкласс UITextField, который имеет IBOutlet
свойство с именем nextField. Вот заголовок:
@interface SOTextField : UITextField
@property (weak, nonatomic) IBOutlet UITextField *nextField;
@end
И вот реализация:
@implementation SOTextField
@end
В вашем контроллере представления вы создадите -textFieldShouldReturn:
метод делегата:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ([textField isKindOfClass:[SOTextField class]]) {
UITextField *nextField = [(SOTextField *)textField nextField];
if (nextField) {
dispatch_async(dispatch_get_current_queue(), ^{
[nextField becomeFirstResponder];
});
}
else {
[textField resignFirstResponder];
}
}
return YES;
}
В IB измените ваши UITextFields для использования SOTextField
класса. Затем, также в IB, установите делегат для каждого из 'SOTextFields' в 'Владелец файла' (который находится там, где вы положили код для метода делегата - textFieldShouldReturn). Прелесть этого дизайна в том, что теперь вы можете просто щелкнуть правой кнопкой мыши на любом textField и назначить выход nextField следующему SOTextField
объекту, который вы хотите стать следующим респондентом.
Более того, вы можете делать классные вещи, такие как цикл textFields, чтобы после того, как последний потерял фокус, первый снова получит фокус.
Это может быть легко расширена для автоматического назначения returnKeyType
из SOTextField
к , UIReturnKeyNext
если есть nextField назначен - одна вещь меньше вручную настроить.