Автозаполнение пароля вставляет пароль в родительский UIViewController
Я использую UINavigationController для нажатия нескольких контроллеров представления. В какой-то момент пользователь может использовать автозаполнение пароля для установки нового пароля. Пароль также добавляется в текстовые поля для родительских контроллеров представления.
Просмотр стека контроллеров
UINavigationController -> View Controller A -> View Controller B -> View Controller C
Контроллер представления A имеет два поля для электронной почты / пароля типа UITextField.
View Controller B имеет одно поле для электронной почты типа UITextField.
View Controller C имеет два поля для пароля / confirmPassword типа UITextField.
Эта проблема
Когда пароль сбрасывается в View Controller C, появляется View Controller, и я наблюдаю в функции делегата
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
что вновь созданный пароль вставляется в поле электронной почты для View Controller B И поле электронной почты для View Controller A. В результате поля ввода имеют значение, похожее на
bob@company.comNEWLY-MADE-PASSWORD
. Почему пароль вставляется в UITextField с
.textContentType = .emailAddress
во-первых, меня тоже сбивает с толку.
Почему автозаполнение пароля пытается быть умным и вставить новый пароль в поле родительских контроллеров представления? Для меня это в некоторой степени головная боль, что приводит к некоторым неудобным проверкам в функции делегата, чтобы запретить вставку пароля.
В ответ на комментарий El Tomato: Apple использует термин «всплыл» в своих документах, чтобы описать, что происходит, когда вы звоните
popViewController(animated:)
.
Контроллеры представлений не представлены. Все они помещаются в стек, управляемый UINavigationController, как указано в заголовке ->
View controller stack
.
Отсутствует соответствующий код, автозаполнение пароля разрешается эвристикой, скрытой от разработчика, это встроенная функция, созданная Apple.