Swift использует обработчики завершения, чтобы заблокировать представление в одном контроллере для отражения в другом - PullRequest
0 голосов
/ 19 декабря 2018

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

Я ожидаю, чтобы было реализовано следующее.

  1. Пользователь прибывает на экран (просмотр контроллера) и готов к «Блокировке» там выбора
  2. Блокировка / разблокировказначок в правом верхнем углу на панели навигации
  3. Пользователь щелкает значок, чтобы заблокировать
  4. Отображается окно UIAlert, подтверждающее, что пользователь хочет заблокировать свой выбор
  5. Пользователь подтверждает
  6. Пользователю предоставляется другое представление, позволяющее ему вводить 'PIN'
  7. Если он нажимает кнопку отмены, отклоняет контроллер представления PIN-кода, и состояние блокировки остается разблокированным
  8. Если онинажмите «Отправить», отклоните модальный контроллер ПИН-кода
  9. Значок в правом верхнем углу должен измениться на значок «Заблокировано»

Кажется, что все работает, за исключением того, чтозначок и состояние не обновляются должным образом, так как может показаться, что, как только пользователь получает ПИН-код модального представления, код просто продолжает выполняться, в котором статус «Блокировка» остается как «Unloc».ked ', так как пользователь не ввел свой ПИН-код и нажал кнопку отправки, что изменило бы статус «Блокировка»?

Могут ли обработчики завершения «приостановить» состояние, пока пользователь не отобразит модальное окно, после чего введите ПИН-кода затем отправляет свой PIN-код ... и помните, что пользователь также может нажать "Отмена", если он хочет больше не блокировать по какой-либо причине?

1 Ответ

0 голосов
/ 19 декабря 2018

В FirstViewController вы можете добавить по завершении при блокировке / разблокировке щелчка элемента навигации,

func lockOrUnlock() {
    let pinVC = PinViewController()
    pinVC.onCompletion = { [weak self] (isPinChanged) in
        //change the lock/unlock icon based on isPinChanged flag
        //if true then update the status else revert the status to prev one
        }
    let pinVCNavController = UINavigationController(rootViewController: pinVC)
    pinVCNavController.modalPresentationStyle = .currentContext
    self.present(pinVCNavController, animated: true, completion: nil)
}

В PinViewController, вернуть значение флага как true or false в зависимости от выбора пользователя для отправки илиотменить действие,

var onCompletion: ((Bool) -> Void)?

override func viewDidLoad() {
    super.viewDidLoad()
    let cencelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelAction))
    self.navigationItem.leftItemsSupplementBackButton = true
    self.navigationItem.leftBarButtonItem = cencelButton
}

@IBAction func submitAction(_ sender: Any) {
    self.onCompletion?(true)
}

func cancelAction() {
    self.onCompletion?(false)
}
...