UITextView: Должен ли я всегда подавать в отставку FirstResponder?
Должен ли я всегда подавать в отставку FirstResponder для UITextView
? Или это произойдет автоматически, когда его контроллер вида исчезнет?
Я спрашиваю, потому что у меня есть проблема, похожая на iPhone Objective-C: клавиатура не будет прятаться с resignFirstResponder, иногда, где клавиатура остается, даже когда контроллер nav нажимает и выскакивает другие контроллеры представления. Клавиатура работает, и когда я нажимаю "Готово", она не фокусируется UITextView
(т. е. курсор исчезает), но клавиатура остается включенной.
Я так и не узнал, почему это происходит, но, может быть, это из-за не делать resignFirstResponder
до нажатия другого контроллера просмотра, но я думал, что это необязательно?
4 ответа
Я не думаю, что вы должны, потому что Xcode Sample UICatalogUITextField
не звонит resignFirstResponder
перед TextViewController
выскочил.
Причина, по которой клавиатура застряла для меня, состоит в том, что у меня был один и тот же контроллер представления, представляющий два контроллера вида одновременно, один за другим. UIKit
не понравилось это
По общему мнению, UITextView имеет ссылку на контроллер представления (как его делегат), но не сохраняет его. Когда вы переходите к следующему экрану, контроллер освобождается, а затем UITextView (который, возможно, был сохранен чем-то другим) пытается перезвонить освобожденному контроллеру и вылетает. Когда вы звоните resignFirstResponder
, вы меняете порядок, в котором это происходит, и поэтому не происходит сбой.
Способ обойти это, чтобы добавить textView.delegate = nil
позвоните в вашем представлении контроллера dealloc
Метод - очевидно, поставьте его перед тем, как отпустить текстовое представление.
Контракт между UITextView и его делегатом говорит, что делегат отправит -resignFirstResponder, когда текстовое представление закончит редактирование. Это информирует платформу о том, что представление завершено редактированием, инициирует связанные с этим события (willEndEditing и didEndEditing) и позволяет другим частям иерархии респондента реагировать соответствующим образом. Невыполнение этого требования может сработать, но оно не следует контракту (это все протокол), на которое он согласился.
Призвание resignFirstResponder
удостоверяется, что text
свойство содержит фактический текст, отображаемый в элементе управления.
В зависимости от состояния это не всегда необходимо, но если ваши элементы управления отказались от первого ответчика, вы знаете, что работаете с действительными данными.