Приложение iOS "next" не переходит в следующее текстовое поле
У меня простая сцена (с использованием раскадровки в IB) с текстовым полем Username и Password. Я установил клавиатуру для закрытия, когда вы находитесь в текстовом поле "Пароль" , но не можете получить следующую кнопку (возврат), чтобы работать с именем пользователя, чтобы переключить фокус (или первый ответчик) в текстовое поле "Пароль" .
Я закрываю клавиатуру, находясь в текстовом поле "Пароль" следующим образом:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
}
return YES;
}
Я знаю, что это нечто похожее на это, но просто не может прибить его.
Ответы
Ответ 1
Ключ возврата по умолчанию не делает ничего особенного в текстовом поле. Вам нужно явно изменить первого ответчика:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.textUsername) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
Ответ 2
Я использую этот код, который позволяет мне управлять поведением формы в раскадровке:
-(BOOL) textFieldShouldReturn:(UITextField *)textField{
if(textField.returnKeyType==UIReturnKeyNext) {
UIView *next = [[textField superview] viewWithTag:textField.tag+1];
[next becomeFirstResponder];
} else if (textField.returnKeyType==UIReturnKeyDone) {
[textField resignFirstResponder];
}
return YES;
}
Все, что вам нужно, - это присвоить значение порядка tag
и returnkey
в соответствии с Далее или Готово для каждого элемента управления.
Ответ 3
для тех, кто хочет использовать язык Swift:
class MyClass: UIViewController, UITextFieldDelegate {
@IBOutlet weak var text1: UITextField!
@IBOutlet weak var text2: UITextField!
@IBOutlet weak var text3: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
text1.delegate = self
text2.delegate = self
text3.delegate = self
}
//....
func textFieldShouldReturn(textField: UITextField) -> Bool{
if textField == self.text1 {
self.text2.becomeFirstResponder()
}else if textField == self.text2{
self.text3.becomeFirstResponder()
}else{
self.text1.becomeFirstResponder()
}
return true
}
//...
}
: -)
Ответ 4
Вы должны добавить UITextFieldDelegate в заголовочный файл.
Затем вы должны установить
theTextField.delegate = self;
в методе viewDidLoad.
После этого вы можете продолжить
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.textUsername) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
Ответ 5
Существует много решений этой проблемы. См. Ответы на этот вопрос: Как перемещаться по текстовым полям (кнопки "Далее/Готово" ).
Подробнее в Ссылка на класс UIResponder.
Ответ 6
Вот что вы бы поставили:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.usernameField) {
[self.textPassword becomeFirstResponder];
}
return YES;
}
Ответ 7
Вы можете использовать этот подкласс UITextfield, который динамически меняет UIReturnKey в соответствии с условием text/string, а затем выполняет ваше действие продолжения в textFieldShouldReturn: (UITextField *) textField delegate
if (textField.returnKeyType == UIReturnKeyNext)
https://github.com/codeinteractiveapps/OBReturnKeyTextField
Ответ 8
У меня возникла проблема, когда текстовое поле пароля фокусируется, а затем сразу теряется фокус. Наконец, я обнаружил, что нам лучше вернуть НЕТ в функцию textFieldShouldReturn:. Если мы вернем ДА, текстовое поле получит запрос insertText:. Затем он потеряет фокус. Не знаю причины.
Я создал новый вопрос для этой проблемы: UITextField получить фокус, а затем сразу же потерять фокус из-за возврата YES в textFieldShouldReturn
Если кто-нибудь знает причину, сообщите мне. Спасибо.
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
[theTextField resignFirstResponder];
} else if (theTextField == self.textUsername) {
[self.textPassword becomeFirstResponder];
}
// we'd better return NO here
return NO;
}
Ответ 9
Вот версия Swift 2.0 Роб Майофф
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField == self.emailTextField {
self.passwordTextField.becomeFirstResponder()
}else{
self.passwordTextField.resignFirstResponder()
}
return false
}
Ответ 10
Я попытался использовать ответ Esteve, но он не работает. Может быть, потому, что я использую xib файлы. То, что я сделал, это изменить его код, чтобы он работал в моем коде.
Он работает таким же образом. Все, что вам нужно, - назначить значение ордера как тег и вернуть ключ в соответствии с "Далее" или "Готово" или "Отправить" на каждом элементе управления вводом.
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
if(textField.returnKeyType==UIReturnKeyNext) {
UITextField *next = (UITextField *)[self.view viewWithTag:textField.tag+1];
[next becomeFirstResponder];
} else if (textField.returnKeyType==UIReturnKeySend) {
//Do whatever you want with the last TextField
}
return YES;
}