Отключить лист действий Сохранить пароль при выходе из UIViewController?

В моем приложении есть контроллер представления «Создать учетную запись» (показан ниже), который предлагает пользователю ввести имя пользователя и пароль. Всякий раз, когда я перехожу к другому контроллеру представления, я получаю всплывающую страницу действий с предложением сохранить пароль в связке ключей.

Это отличный подарок, ЕСЛИ пользователь успешно создает новую учетную запись. Но я получаю такое же всплывающее окно, если пользователь нажимает кнопку отмены (назад) на панели навигации, если он выбирает вариант использования входа в Facebook вместо создания учетной записи или любые другие средства для выхода из этого контроллера представления (см. Рисунки ниже).

Как сделать так, чтобы это всплывающее окно отображалось ТОЛЬКО, когда пользователь успешно создает новую учетную запись?

ИЗМЕНИТЬ: вот код, связанный с переходами, которые приводят к появлению окна действий «Сохранить пароль» для каждого запроса.

из CreateAccountViewController.swift:

class CreateAccountViewController : UIViewController
{
  // ... bunch of irrelevant code deleted ...

  // bound to "Connect with Facebook" button (see image below)
  @IBAction func switchToFacebook(_ sender : UIButton)
  {
    performSegue(.SwitchToFacebookLogin, sender: sender)
  }
  // ... bunch of irrelevant code deleted ...
}

extension CreateAccountViewController : GameServerAlertObserver
{
  // callback based on response from GameCenter after 
  //  submitting a "create new user" request
  func handleConnectionResponse(_ response:GameServerResponse )
  {
    switch response
    {
    // ... other response cases removed ...
    case .UserCreated:
      self.removeSpinner()
      performSegue(.CreateAccountToStartup, sender: self)

    default:
      response.displayAlert(over: self, observer: self)
      self.removeSpinner()
    }
  }

  // Functions defined in the GameServerAlertObserver protocol
  //   to handle user response to "User Exists Popup" (figure below)    
  func ok()
  {
    // user chose to enter new  password... clear the existing username field
    usernameTextField.text = ""
  }

  func cancel()
  {
    // segue back to the startup view controller
    performSegue(.CreateAccountToStartup, sender: self)
  }

  func goToLogin()
  {
    // segue to the login view controller
    performSegue(.SwitchToAccountLogin, sender:self)
  }
}

из UIViewController_Segues:

enum SegueIdentifier : String
{
  case LoserBoard             = "loserBoard"
  case CreateAccount          = "createAccount"
  case AccountLogin           = "accountLogin"
  case FacebookLogin          = "facebookLogin"
  case SwitchToFacebookLogin  = "switchToFacebookLogin"
  case SwitchToAccountLogin   = "switchToAccountLogin"
  case CreateAccountToStartup = "createAccountToStartup"
  case AccountLoginToStartup  = "accountLoginToStartup"
  case FacebookLoginToStartup = "facebookLoginToStartup"
  case UnwindToStartup        = "unwindToStartup"
}

extension UIViewController
{ 
  func performSegue(_ target:SegueIdentifier, sender:Any?)
  {
    performSegue(withIdentifier: target.rawValue, sender: sender)
  }
}

из GameServerAlert.swift:

protocol GameServerAlertObserver
{
  func ok()
  func cancel()
  func goToLogin()
}

extension GameServerResponse
{
  func displayAlert(over controller:UIViewController, observer:GameServerAlertObserver? = nil)
  {
    var title   : String
    var message : String
    var actions : [UIAlertAction]

    switch self
    {
    // ... deleted cases/default which don't lead to segue ...

    case .UserAlreadyExists:
      title = "User already exists"
      message = "\nIf this is you, please use the login page to reconnect.\n\nIf this is not you, you will need to select a different username."
      actions = [
        UIAlertAction(title: "Go to Login page",   style: .default, handler: { _ in observer?.goToLogin() } ),
        UIAlertAction(title: "Enter new username", style: .default, handler: { _ in observer?.ok() } ),
        UIAlertAction(title: "Cancel",             style: .cancel,  handler: { _ in observer?.cancel() } )
      ]
    }

    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    actions.forEach { (action) in alert.addAction(action) }
    controller.present(alert,animated:true)
  }
}

Примеры из симулятора:

Создать учетную запись - (здесь пользователь вводит имя пользователя и пароль для новой учетной записи.)

введите описание изображения здесь

Вход в Facebook

Если пользователь решает использовать Facebook для входа в систему, а не создавать учетную запись пользователя, он попадает в это представление (которое я до сих пор не уточнил). Обратите внимание, что всплыло окно действий «Сохранить пароль».

введите описание изображения здесь

Всплывающее окно "Пользователь существует"

Если пользователь попытается создать учетную запись с уже существующим именем пользователя, ему будет представлено это всплывающее окно. Если они выберут Отмена, они вернутся на начальный экран (см. Ниже). Если они выберут Введите новое имя пользователя, они останутся на том же экране с очищенным именем пользователя. Если они выберут Вход, они попадут на экран входа в систему.

введите описание изображения здесь

Экран запуска

Если пользователь выбирает Отмена выше, они возвращаются сюда. Опять же, обратите внимание, что всплыло окно действий «Сохранить пароль».

введите описание изображения здесь


person MikeMayer67    schedule 22.03.2020    source источник
comment
Вы смогли найти решение этой проблемы?   -  person Rog    schedule 07.05.2020
comment
Я закончил рефакторинг своего дизайна, чтобы обойти проблему ... Я так и не решил ее. Но ... я считаю, что ответ mitch10e (ниже) может содержать ключ к фактическому исправлению. Я собираюсь проверить это позже на более ранней версии моего кода.   -  person MikeMayer67    schedule 10.05.2020


Ответы (3)


Извините за короткий ответ, я обычно не публикую на этом сайте. Это автозаполнение пароля, которое происходит на вашем устройстве при закрытии экрана создания пользователя.

Документация Apple: https://developer.apple.com/documentation/security/password_autofill

Вот ссылка на сайт, который очень хорошо соответствует всем требованиям: https://developerinsider.co/ios12-password-autofill-automatic-strong-password-and-security-code-autofill/

person mitch10e    schedule 08.05.2020
comment
Спасибо. В итоге я внес заметные изменения в свой дизайн, чтобы обойти проблему. Но я обязательно посмотрю на предоставленные вами ссылки, чтобы узнать, решило ли это мою проблему. - person MikeMayer67; 10.05.2020
comment
Примерно на 3/4 пути вниз по второй ссылке я нашел критерии, необходимые для отображения всплывающего окна автоматического сохранения. Похоже, если бы я очистил поля пароля до закрытия представления входа в систему, всплывающее окно не соответствовало бы критериям, и всплывающее окно автоматического сохранения не отображалось бы. Я собираюсь пока проголосовать за этот ответ. Через некоторое время я посмотрю, смогу ли я восстановить старую версию из git и протестировать это. Если это сработает, я отмечу это как ответ. Спасибо. - person MikeMayer67; 10.05.2020

Что я делаю, чтобы избежать автоматического отображения списка действий Сохранение пароля, когда пользователь:

  • отклонить контроллер просмотра входа в систему;
  • открыть контроллер представления;
  • использовать интерактивный поп-жест.

=>

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
      passwordTextField.textContentType = .password
    }
  }

  override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if isMovingFromParent || isBeingDismissed || parent?.isBeingDismissed == true {
      passwordTextField.textContentType = nil
    }
  }
person Ded77    schedule 30.05.2020
comment
Мне также пришлось очистить текст passwordTextField, чтобы это сработало. Так что добавьте passwordTextField.text = nil к viewWillDisappear. - person Crt Gregoric; 14.10.2020
comment
Также делайте это только в том случае, если вы не хотите, чтобы система показывала опцию «Сохранить пароль». Если пользователь действительно обновил свои учетные данные, содержимое viewWillDisappear не должно выполняться. - person Crt Gregoric; 14.10.2020

Добавьте условие перед запуском блока кода, который показывает лист действий. Вы можете сделать это просто с помощью оператора if. Эта выписка должна проверять, была ли учетная запись успешно создана или нет. Блок кода, отображающий лист действий, должен запускаться только при выполнении условия.

person Ert    schedule 23.03.2020
comment
Я не показываю явно лист действий. Он волшебным образом появляется после выхода из контроллера представления создания учетной записи. Это должно быть откуда-то из UIKit ... но я не могу найти никакой документации по этому поводу. - person MikeMayer67; 23.03.2020
comment
Мы можем изучить это вместе, если вы поделитесь соответствующим кодом в своем вопросе. Не видя кода, выяснить причину непросто. - person Ert; 24.03.2020
comment
Что именно вы считаете подходящим кодом в этом случае? Сама суть моего вопроса заключается в том, что вызывает отображение листа действий «Сохранить пароль», когда я перехожу с виртуального канала создания учетной записи на любой другой виртуальный канал. Я добавил код, запускающий переход, но не вижу, как это будет полезно. - person MikeMayer67; 24.03.2020