У меня возникла проблема с изменением типа клавиш возврата при редактировании текстового поля моего представления. Поэтому, когда пользователь щелкает текстовое поле, у меня есть несколько проверок, которые изменяют тип возврата клавиатуры, эти проверки помещаются в - (void)textFieldDidBeginEditing:(UITextField *)textField
, когда я меняю здесь клавишу возврата клавиатуры, код работает нормально. Я просто меняю клавишу возврата на клавиатуру вот так [textField setReturnKeyType:UIReturnKeyDone];
. Итак, есть 2 текстовых поля: имя пользователя и пароль. Если в обоих текстовых полях есть текст, я хочу изменить клавишу возврата на ГОТОВО, если есть текст только в одном из текстовых полей, я хочу изменить его на ДАЛЕЕ, чтобы я мог прыгать туда и обратно между текстовыми полями. Итак, теперь я помещаю некоторые сдержки и противовесы в - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
. Тем не менее, тот же код, который я помещал в textFieldDidBeginEditing
, не работает в этой функции. Я прочитал кучу сообщений, и все они говорят, что нужно удалить текстовое поле в качестве первого ответчика, затем установить клавишу возврата и снова стать ответчиком, но это портит мой текущий поток в соответствующих методах. Я также читал, что мне нужно вызвать [textfield reloadInputFields]
после установки ключа возврата, но это снова не работает. Вы могли бы подумать, что Apple уже исправила бы такую ошибку. В любом случае, у кого-нибудь есть какой-то вклад здесь?
Изменение типа ключа возврата при редактировании UITextField?
Ответы (2)
Мне пришлось реализовать логику добавления тега, которая требовала изменения клавиши возврата клавиатуры в зависимости от текста, введенного в UITextField. Найти, как изменить клавишу возврата, было довольно легко, но когда я начал тестировать, я заметил, что это решение работает только для iOS10, но не для iOS9. Потратив некоторое время и проведя некоторые исследования, я придумал этот обходной путь, он не самый приятный, но, по крайней мере, он работает.
if #available(iOS 10.0, *) {
textField.reloadInputViews()
} else {
textField.keyboardType = .numberPad
textField.reloadInputViews()
textField.keyboardType = .default
textField.reloadInputViews()
}
Попробуйте и дайте мне знать
Я сделал демонстрацию для вашего вопроса, и она работает идеально в соответствии с вашими потребностями, или вы можете изменить ее в соответствии с
// Это событие действия 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;
}