Я знаю, что этот вопрос может показаться дублирующим, но, глядя на несколько ответов, у меня пока ничего не работает.
По сути, у меня есть приложение-викторина, отображается вопрос, и пользователю нужно заполнить несколько UITextFields, чтобы ответить на вопрос (т. Е. Если ответ ВЕНЕЦИЯ, будет показано 6 UITextFields, по 1 на букву).
Он смог обнаружить один символ в UITextFields, и как только пользователь нажмет клавишу, он перейдет к следующему UITextField. Я использую тег UITextField и метод becomeFirstResponder.
Проблема в том, что я хотел бы обнаружить возврат, когда UITextField пуст, поэтому я перейду к предыдущему UITextField.
Я пробовал это решение от Джейкоба Карабальо (Обнаружение возврата в пустой UITextField), но я не уверен, как использовать его с моим существующим UITextField.
Например, я пробовал:
// @IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField1:MyTextField!
Но вызов делегата
textField1.myDelegate = self
Вылетает
Я также замечаю, что, используя решение Джейкоба, я не смогу проверить, какой UITextField использовался, поскольку func textFieldDidDelete() не имеет UITextField as параметра, и мне нужно будет проверить его тег, т.е.
If textField.tag == 5 {
textField4.becomeFirstResponder()
}
Любая помощь в этом, пожалуйста?





Если вы используете решение Джейкоба, метод deleteBackward будет вызываться с текущим экземпляром UITextField. Таким образом, вы можете добавить протокол к этому UITextField классу и передать его обратно в свое представление.
Что-то вроде этого:
protocol MyTextFieldDelegate: class {
func backwardDetected(textField: MyTextField)
}
class MyTextField: UITextField {
weak var myTextFieldDelegate: MyTextFieldDelegate?
override func deleteBackward() {
super.deleteBackward()
self.myTextFieldDelegate?.backwardDetected(textField: self)
}
}
каждый из ваших делегатов должен быть типа MyTextField. и для каждого из них добавьте эту строку: self.textField1.myTextFieldDelegate = self
после этого реализуйте метод func backDetected(textField: MyTextField) в вашем контроллере/представлении
Извините Лирик, у меня ошибка в классе. В нем говорится: значение типа «UITextFieldDelegate» не имеет члена «backwardDetected».
исправил мой код выше. Это должно быть: self.myTextFieldDelegate?.backwardDetected(textField: self). Извини за это ;)
Спасибо, Лирик, и большое спасибо за вашего пациента :-). Теперь при установке делегата у меня ошибка при попытке запустить приложение в строке self.textField1.myTextFieldDelegate = self, приложение построено так, что просто при запуске выдает ошибку Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT). Есть идеи, почему? Я создал новое приложение с нуля
Я думаю, что проблема заключается в объявлении IBOutlets, чтобы создать IBOutlet, который я управляю + перетаскиваю свой UITextView, а в типе я меняю значение по умолчанию (UITextField) на MyTextField, возможно, это проблема, но я не знаю другого способа для создания IBOutlets
Я решаю, что это меняется в Identity Inspector с UITextField на MyTextField. Лирик спасибо большое!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Рад помочь! @ХорхеФернандес
Спасибо Lyric, но как мне объявить свой UITextField и как установить делегат? @IBOutlet слабая переменная textField1:MyTextField! объявление для каждого UITextField верно? и как установить делегата для каждого UITextField? Извините, я немного потерялся с этим