Подтвердить что ты не робот

Приложение iOS "next" не переходит в следующее текстовое поле

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

Я закрываю клавиатуру, находясь в текстовом поле "Пароль" следующим образом:

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

Я знаю, что это нечто похожее на это, но просто не может прибить его.

4b9b3361

Ответ 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;
}

Ответ 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;
}