перезапуск приложения вызывает NSInvalidArgumentException - PullRequest
0 голосов
/ 19 октября 2018

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

Я перезапускаю свое приложение, используя приведенный ниже код.

func restartApplication () {
       let viewController = SomeViewController()
       let navCtrl = UINavigationController(rootViewController: viewController)

       guard
           let window = UIApplication.shared.keyWindow,
           let rootViewController = window.rootViewController
           else {
               return
       }

       navCtrl.view.frame = rootViewController.view.frame
       navCtrl.view.layoutIfNeeded()

       UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
           window.rootViewController = navCtrl
       })

   }

Работает.Но когда приложение достигает viewDidAppear() и ему нужно показать мой диалог, приложение вылетает, говоря:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'Receiver (<AppName.SomeViewController: 0x150dda00>) has no segue with identifier 'showSetup''

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

В настоящее время я конвертирую свое приложение для Android в iOS, поэтому я хочу сделать все, что смогу конвертировать.

Вот как я делаю переход.

DispatchQueue.main.async {
   self.performSegue(withIdentifier: "showSetup", sender: self)
}

1 Ответ

0 голосов
/ 19 октября 2018

Поскольку ваш «перезапущенный» контроллер представления не исходит от раскадровки, любые ссылки на сегы (которые опираются на раскадровку) не будут выполнены.

Вам нужно что-то вроде:

func restartApplication () {
   let navCtrl = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("NavController")

   guard
       let window = UIApplication.shared.keyWindow,
       let rootViewController = window.rootViewController
   else {
           return
   }

   navCtrl.view.frame = rootViewController.view.frame
   navCtrl.view.layoutIfNeeded()

   UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
       window.rootViewController = navCtrl
   })

}
...