Є набагато більш елегантне рішення, яке зневажило мене вперше, коли я його побачив. Переваги:
- Ближче до реалізації текстового поля OSX, де текстове поле знає, куди слід звернути увагу
- Не покладається на встановлення або використання тегів - які є IMO крихким для цього випадку використання
- Може розширюватися для роботи з обома елементами управління
UITextField
та UITextView
управлінням - або будь-яким елементом керування інтерфейсом вводу на клавіатурі
- Не захаращує ваш контролер подання кодом делегата UITextField
- Добре інтегрується з IB і може бути налаштований через звичний варіант перетягування для підключення розеток.
Створіть підклас 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). Краса цього дизайну полягає в тому, що тепер ви можете просто клацнути правою кнопкою миші на будь-якому текстовому полі і призначити наступну розетку наступного поля для наступного SOTextField
об'єкта, який ви хочете стати наступним респондентом.
Більше того, ви можете робити цікаві речі, такі як цикл текстових полів, так що після того, як останній втратить фокус, перший знову отримає фокус.
Це може бути легко розширена для автоматичного призначення returnKeyType
з SOTextField
до , UIReturnKeyNext
якщо є nextField призначений - одна річ менше вручну налаштувати.