Захватите методы делегата из подкласса UITextField, не будучи делегатом

У меня есть подкласс UITextField. Мне нужно было знать, когда текст изменился, и я смог получить это с помощью NotificationCenter и наблюдения за .UITextFieldTextDidChange, но теперь мне нужно знать, когда пользователь нажимает кнопку возврата. Единственное решение, которое я могу придумать, - это установить подкласс UITextField в качестве делегата самого себя, но это звучит не совсем чисто.

  1. Есть ли чистый способ получить событие клавиши возврата из подкласса
  2. Можно ли установить подкласс UITextField в качестве делегата самого себя?

person iOSGeek    schedule 16.10.2017    source источник
comment
Могу я спросить, зачем вам это нужно?   -  person Andrea    schedule 16.10.2017
comment
В настоящее время я использую «UITextFieldDelegate», где я устанавливаю делегата в соответствующие текстовые поля, где необходимо идентифицировать кнопку RETURN. Затем вы можете идентифицировать с помощью «func textFieldShouldReturn (_ textField: UITextField) -> Bool», если была нажата кнопка возврата. Тем не менее, я не уверен на 100%, что это самое чистое решение.   -  person AlexWoe89    schedule 16.10.2017
comment
Здесь есть интересное обсуждение второго пункта вашего вопроса: " title=" соответствует ли класс, являющийся собственным делегатом, соглашению ios"> stackoverflow.com/questions/29054602/   -  person Craig Grummitt    schedule 16.10.2017
comment
@Andrea Пытаясь сделать textField адаптированным для использования в качестве текстового поля поиска, я в итоге поместил textField в UIView и сделал это представление делегатом. Хорошая вещь в том, что я могу скрыть текстовое поле (private) и показать, что есть нужно только   -  person iOSGeek    schedule 17.10.2017


Ответы (2)


В вашем подклассе сделайте

self.addTarget(self, action: #selector(returnKeyPressed), for: .editingDidEndOnExit);

Глядя на документ Apple, вы видите UIControlEvents

UIControlEventEditingDidEndOnExit = 1 ‹‹ 19, // 'клавиша возврата' завершает редактирование

person Ladislav    schedule 16.10.2017
comment
Хорошо знать. Это ответ на вопрос. Но в итоге я обернул textField в UIView и сделал его делегатом UITextField, который может быть private - person iOSGeek; 17.10.2017

Вы можете установить свой viewController в качестве делегата. В viewDidLoad вы можете добавить эту строку кода.

myTextField.delegate = self

Вам также нужен протокол UITextFieldDelegate для viewController.

extension MyViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        //User tapped the return button
        return true
    }
}

Я думаю, что нет ничего плохого в том, чтобы установить делегата в подкласс. Если вам нужно знать кран за пределами вашего класса, вам понадобится еще один делегат, так что вы можете также использовать мое первое решение. Вы также должны знать, что если вы измените делегат, ваш код в подклассе больше не будет вызываться, и это может привести к неожиданному поведению.

person Yannick    schedule 16.10.2017
comment
То, что вы написали, прекрасно, он спрашивал, что он может делать внутри своего подкласса UITextField, и там не рекомендуется использовать делегата, поскольку пользователь подкласса, подобный тому, который вы упомянули выше, MyViewController хотел бы быть делегатом :) - person Ladislav; 17.10.2017
comment
Я спрашивал о том, чтобы сделать textField самим делегатом, например: textField.delegate = self, но я знаю, что ViewController может быть делегатом - person iOSGeek; 17.10.2017
comment
Я ответил на оба его вопроса. Первый ничего не запрашивает внутри своего подкласса. Он требует чистого решения, и я думаю, что установка ViewController в качестве делегата является чистым решением. - person Yannick; 17.10.2017