Изменение типа ключа возврата при редактировании UITextField?

У меня возникла проблема с изменением типа клавиш возврата при редактировании текстового поля моего представления. Поэтому, когда пользователь щелкает текстовое поле, у меня есть несколько проверок, которые изменяют тип возврата клавиатуры, эти проверки помещаются в - (void)textFieldDidBeginEditing:(UITextField *)textField, когда я меняю здесь клавишу возврата клавиатуры, код работает нормально. Я просто меняю клавишу возврата на клавиатуру вот так [textField setReturnKeyType:UIReturnKeyDone];. Итак, есть 2 текстовых поля: имя пользователя и пароль. Если в обоих текстовых полях есть текст, я хочу изменить клавишу возврата на ГОТОВО, если есть текст только в одном из текстовых полей, я хочу изменить его на ДАЛЕЕ, чтобы я мог прыгать туда и обратно между текстовыми полями. Итак, теперь я помещаю некоторые сдержки и противовесы в - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string. Тем не менее, тот же код, который я помещал в textFieldDidBeginEditing, не работает в этой функции. Я прочитал кучу сообщений, и все они говорят, что нужно удалить текстовое поле в качестве первого ответчика, затем установить клавишу возврата и снова стать ответчиком, но это портит мой текущий поток в соответствующих методах. Я также читал, что мне нужно вызвать [textfield reloadInputFields] после установки ключа возврата, но это снова не работает. Вы могли бы подумать, что Apple уже исправила бы такую ​​​​ошибку. В любом случае, у кого-нибудь есть какой-то вклад здесь?


person Esko918    schedule 02.11.2015    source источник


Ответы (2)


Мне пришлось реализовать логику добавления тега, которая требовала изменения клавиши возврата клавиатуры в зависимости от текста, введенного в UITextField. Найти, как изменить клавишу возврата, было довольно легко, но когда я начал тестировать, я заметил, что это решение работает только для iOS10, но не для iOS9. Потратив некоторое время и проведя некоторые исследования, я придумал этот обходной путь, он не самый приятный, но, по крайней мере, он работает.

if #available(iOS 10.0, *) {
    textField.reloadInputViews()
} else {
    textField.keyboardType = .numberPad
    textField.reloadInputViews()
    textField.keyboardType = .default
    textField.reloadInputViews()
}
person Christian Schober    schedule 27.02.2017
comment
Сделал мой день. :) - person Yash Bedi; 12.08.2019

Попробуйте и дайте мне знать

Я сделал демонстрацию для вашего вопроса, и она работает идеально в соответствии с вашими потребностями, или вы можете изменить ее в соответствии с

// Это событие действия Editing Changed для обоих текстовых полей, созданных из StoryBoard

- (IBAction)txtEditingChanged:(UITextField *)sender
{
    [sender resignFirstResponder];
    [sender becomeFirstResponder];
}

// Это событие действия Завершено редактирование для обоих текстовых полей, созданных из StoryBoard

- (IBAction)txtEditingEnd:(UITextField *)sender
{
    if (txtUserName.text.length == 0 || txtPassword.text.length == 0)
    {
        [txtUserName setReturnKeyType:UIReturnKeyNext];
        [txtPassword setReturnKeyType:UIReturnKeyNext];
    }
    else
    {
        [txtUserName setReturnKeyType:UIReturnKeyDone];
        [txtPassword setReturnKeyType:UIReturnKeyDone];
    }
}

// Это события кнопки "Далее и готово", т. е. делегат UITextField

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (textField == txtUserName && textField.returnKeyType == UIReturnKeyNext && textField.text.length != 0)
    {
        [txtPassword becomeFirstResponder];
    }
    else if (textField == txtPassword && textField.returnKeyType == UIReturnKeyNext && textField.text.length != 0)
    {
        [txtUserName becomeFirstResponder];
    }
    else
    {
        // This is your Done Button Event You Can Procced Here
    }
    return YES;
}
person Mubin Mall    schedule 10.11.2015
comment
Спасибо, но я попробую это в будущем выпуске, я заработал так, как мне это нужно. - person Esko918; 12.11.2015