Лучший способ использовать кнопку "Далее" кнопки "Возврат" на UITextField для перехода к следующему UITextField
Я использую значение "Next" для "Return Key", чтобы получить кнопку "Далее" вместо кнопки "Готово", но (очевидно) нажатие на нее не автоматически переходит к следующему UITextField в моем представлении.
Какой правильный способ сделать это? На более широкой теме, каковы некоторые советы по правильному созданию форм в iPhone SDK?
Ответы
Ответ 1
Сделать некоторый объект первым делегатом текстового поля и реализовать метод - (BOOL)textFieldShouldReturn:(UITextField *)textField
; в этом случае вызовите второе текстовое поле -becomeFirstResponder
. Возвращая YES
, это заставит текстовое поле выполнять поведение по умолчанию для кнопки возврата - я думаю, что обычно посылает свое сообщение о действии. Если у вас нет ничего добавленного в качестве цели этого действия, на самом деле не важно, что вы вернете.
Ответ 2
Чтобы основываться на ответе Ноя, если у вас много текстовых полей и вы не хотите иметь кучу if, вы можете сделать это следующим образом:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
//[[self.view viewWithTag:textField.tag+1] becomeFirstResponder];
UIView *view = [self.view viewWithTag:textField.tag + 1];
if (!view)
[textField resignFirstResponder];
else
[view becomeFirstResponder];
return YES;
}
Как только вы помечаете каждое текстовое поле, начинающееся с любого числа, пока они помечены последовательно, в раскадровке или в коде, это должно работать.
Ответ 3
Для Swift:
func textFieldShouldReturn(textField: UITextField) -> Bool {
//your collection of textfields
guard let i = textFields.indexOf(textField) else { return false }
if i + 1 < textFields.count {
textFields[i + 1].becomeFirstResponder()
return true
}
textField.resignFirstResponder()
return true
}
Ответ 4
Это, кажется, работает достаточно хорошо и не требует системы тегов, о которой многие говорят. В этом решении есть две вещи:
- Все UITextFields должны быть в одном UIView (иметь тот же супервизор).
-
UITextFields должны быть в правильном порядке в построителе интерфейсов.
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
/*
* 1. Loop through the textfield superview
* 2. Get the next textfield in the superview
* 3. Focus that textfield
*/
UIView *superView = [textField superview];
BOOL foundCurrent = false;
for (UITextField *tf in superView.subviews) {
// Set focus on the next textfield
if (foundCurrent) {
[tf becomeFirstResponder];
return NO;
}
//Find current textfield
if ([tf isEqual:textField]) {
foundCurrent = true;
}
}
return YES;
}
Ответ 5
Мне не нравится иметь дело с тегом, поэтому вот мое решение. Создайте IBOutletCollection
всех ваших текстовых полей в ViewController
, перетащите, чтобы соединить текстовые поля по порядку сверху вниз.
@interface ViewController () <UITextFieldDelegate>
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *allTextFields;
@end
В viewDidLoad установите делегат textFields. (Или установите его в раскадровку).
for (VVTextField *tf in self.allTextFields) {
tf.delegate = self;
}
Затем реализуем UITextField Delegate
#pragma mark - UITextField Delegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSUInteger currentIndex = [self.allTextFields indexOfObject:textField];
NSUInteger nextIndex = currentIndex+1;
if (nextIndex < self.allTextFields.count) {
[[self.allTextFields objectAtIndex:nextIndex] becomeFirstResponder];
} else {
[[self.allTextFields objectAtIndex:currentIndex] resignFirstResponder];
}
return YES;
}
Ответ 6
Я тоже борюсь с этой проблемой... и в результате я создал небольшую библиотеку для обработки нескольких текстовых полей. Вы можете найти его на github GNKeyboardAwareScrollView#GNTextFieldsManager.
Вы можете инициализировать его массивом текстовых полей:
NSArray *myTextFields = @[...]; // the order of array matters!
GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithTextFields:myTextFields];
Или путем указания родительского представления (и установки тегов для всех представлений):
GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithView:self.view];
Надеюсь, что я буду полезен для кого-то:)