Клавиша «iOS» приложения iOS не перейдет в следующее текстовое поле - PullRequest
42 голосов
/ 03 марта 2012

У меня есть простая сцена (с использованием раскадровки в IB) с текстовым полем Имя пользователя и Пароль. Я установил закрытие клавиатуры, когда вы находитесь в текстовом поле «Пароль», но не можете заставить следующую кнопку (возврат) работать с именем пользователя, чтобы переключить фокус (или первого ответчика) на текстовое поле «Пароль».

Я закрываю клавиатуру, когда в текстовом поле Пароль, вот так:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == self.textPassword) {
    [theTextField resignFirstResponder];
}
return YES;
}

Я знаю, что это что-то похожее, но просто не могу это зафиксировать.

Ответы [ 10 ]

90 голосов
/ 03 марта 2012

Клавиша возврата по умолчанию ничего не делает в текстовом поле. Вам необходимо явно изменить первого респондента:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    if (theTextField == self.textPassword) {
        [theTextField resignFirstResponder];
    } else if (theTextField == self.textUsername) {
        [self.textPassword becomeFirstResponder];
    }
    return YES;
}
40 голосов
/ 28 июня 2014

Я использую этот код, который позволяет мне контролировать поведение формы в раскадровке :

-(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 в соответствии с Далее или Готово на каждом элементе управления входом.

11 голосов
/ 17 августа 2015

для тех, кто хочет использовать язык 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
 }

 //...

}

: -)

9 голосов
/ 08 января 2015

Вы должны добавить 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 голосов
/ 03 марта 2012

Существует много решений этой проблемы. См. Ответы на этот вопрос: Как перемещаться по текстовым полям (кнопки Далее / Готово) .

Подробнее читайте в справочнике классов UIResponder .

3 голосов
/ 03 марта 2012

Вот что вы бы положили:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    if (theTextField == self.textPassword) {
        [theTextField resignFirstResponder];
    } else if (theTextField == self.usernameField) {
        [self.textPassword becomeFirstResponder];
    }
return YES;
}
0 голосов
/ 03 марта 2016

Вот версия Swift 2.0 Роба Майофа

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == self.emailTextField {
        self.passwordTextField.becomeFirstResponder()
    }else{
        self.passwordTextField.resignFirstResponder()
    }
    return false
}
0 голосов
/ 03 февраля 2016

Я пытался использовать ответ Эстеве, но он не работает. Может быть, потому что я использую файлы XIB. Я изменил его код, чтобы он работал в моем коде.

Работает так же. Все, что вам нужно, это присвоить значение заказа в виде тега и вернуть ключ в соответствии с Next или Done или Send для каждого элемента управления вводом.

- (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;
}
0 голосов
/ 17 ноября 2015

У меня проблема с тем, что текстовое поле пароля получает фокус, а затем сразу теряет фокус. Наконец я обнаружил, что нам лучше вернуть NO в функцию textFieldShouldReturn :. Если мы вернем YES, текстовое поле получит вызов 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;
}
0 голосов
/ 21 октября 2015

Вы можете использовать этот подкласс поля UIText, который динамически изменяет UIReturnKey в соответствии с условием text / string, а затем выполнить действие продолжения в textFieldShouldReturn: (UITextField *) textField делегат

if (textField.returnKeyType == UIReturnKeyNext)

https://github.com/codeinteractiveapps/OBReturnKeyTextField
...