Контроллер представления не закроет и не представит новый контроллер представления немедленно

Я пытаюсь представить контроллер представления после того, как считыватель QRCode был отклонен, однако при этом снова отображается контроллер представления считывателя QRCode. Приведенный ниже фрагмент кода показывает метод и то, как я отклоняю представление и как я пытаюсь представить следующий контроллер представления. Любая идея о том, почему контроллер представления QR-ридера продолжает представлять себя, когда я пытаюсь представить другой контроллер.

func readerDidCancel(_ reader: QRCodeReaderViewController) {
    dismiss(animated: true, completion: nil)
    present(ClockInOrOutViewController(), animated: true, completion: nil)
}

person Minimoore26    schedule 22.08.2018    source источник
comment
Вы не можете этого сделать. Вы должны представлять новый контроллер только тогда, когда предыдущий полностью закрыт.   -  person Vikky    schedule 22.08.2018
comment
@Vikky Как ты предлагаешь мне это сделать?   -  person Minimoore26    schedule 22.08.2018
comment
Я думал, что ответ Конрада Пинкоша сработает. Но это не так, как предполагает ваш комментарий. Итак, теперь вам нужно использовать протоколы и делегатов для решения вашей проблемы. Взгляните на medium.com/swift2go/   -  person Vikky    schedule 22.08.2018


Ответы (2)


Вы должны вызвать present внутри обработчика завершения dismiss.

func readerDidCancel(_ reader: QRCodeReaderViewController) {

    weak var presentingViewController = self.presentingViewController

    self.dismiss(animated: true, completion: {
        presentingViewController?.present(ClockInOrOutViewController(), animated: true, completion: nil)
    })
}

Если это не сработает, значит, ваш контроллер представления представления также каким-то образом был удален. (уволен / всплыл?)

person Rakesha Shastri    schedule 22.08.2018
comment
Только что протестировал ваше решение, оно вызывает у меня ту же проблему, с которой я начал, и выдает эту ошибку в отладчике '‹ClockIn.QRCodeViewController: 0x102c00db0›, представление которого не находится в иерархии окон!' - person Minimoore26; 22.08.2018
comment
Я не думаю, что это сработает. Вы не можете делать презентацию из паршивого ViewController. - person Vikky; 22.08.2018
comment
@Vikky, вы правы, вам нужен экземпляр контроллера представления, который представляет текущий. - person Rakesha Shastri; 22.08.2018

Вы не можете представить контроллер представления, пока другой контроллер представления отклоняется, а также присутствует при удалении контроллера представления. Вы можете сделать что-то вроде этого:

func readerDidCancel(_ reader: QRCodeReaderViewController) {
   let presenting = self.presentingViewController
   dismiss(animated: true, completion: {
      presenting?.present(ClockInOrOutViewController(), animated: true, completion: nil)
   }) 
}
person Konrad Piękoś    schedule 22.08.2018
comment
Ваше решение по-прежнему возвращает меня, и у меня все еще та же ошибка. '‹ClockIn.QRCodeViewController: 0x102c00db0›, представление которого не находится в иерархии окон!' - person Minimoore26; 22.08.2018
comment
Это зависит от того, как вы представили предыдущий контроллер представления. Вы также можете попробовать следующее: func readerDidCancel(_ reader: QRCodeReaderViewController) { dismiss(animated: true, completion: { let presenting = UIApplication.sharedApplication().keyWindow?.rootViewController presenting?.present(ClockInOrOutViewController(), animated: true, completion: nil) }) } - person Konrad Piękoś; 22.08.2018