#ios #uikit
Вопрос:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
не вызывается, если текстовое поле уже пусто и нажата кнопка назад
Я хочу уйти в отставку первым ответчиком и сделать предыдущее поле uitextfield в представлении первым ответчиком
есть ли способ достичь этого?
Ответ №1:
Чтобы достичь того, чего вы хотите, вам нужно подклассировать UITextField
и создать пользовательский протокол, который будет уведомлять вас каждый раз, когда будет нажата кнопка удалить:
protocol CustomTextFieldDelegate: AnyObject {
func deleteBackwardPressed()
}
class CustomTextField: UITextField {
weak var deleteDelegate: CustomTextFieldDelegate?
override func deleteBackward() {
super.deleteBackward()
deleteDelegate?.deleteBackwardPressed()
}
}
При создании вашего UIViewController
он должен соответствовать CustomTextFieldDelegate
. Также не забудьте назначить делегата своему пользовательскому текстовому полю. Упрощенный ViewController выглядел бы примерно так:
class ViewController: UIViewController, CustomTextFieldDelegate {
private var isTextFieldEmpty = false
private let customTextField = CustomTextField()
override func viewDidLoad() {
super.viewDidLoad()
customTextField.deleteDelegate = self
}
func deleteBackwardPressed() {
if isTextFieldEmpty {
customTextField.resignFirstResponder()
} else {
isTextFieldEmpty = customTextField.text?.count == 0
}
}
}