从不同的故事板

时间:2017-08-17 13:29:38

标签: swift uiviewcontroller uistoryboard uistoryboardsegue nsexception

我正在写Swift 3(最新的Xcode)

我正在控制,如果用户已登录(异步任务检查设备和数据库之间的参数)。

如果响应显示设备无效,我将显示登录屏幕。看起来像这样:

extension UIViewController {

    func forceLogin() {

        let storyboard = UIStoryboard(name: "Login", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "LoginViewController")
        let navController = UINavigationController(rootViewController: controller)

        self.present(navController, animated: true, completion: nil)
    }  
}

登录故事板看起来就像这样。

Storyboard example

当用户成功登录时,该功能开始:

DispatchQueue.main.async {
    self.dismiss(animated: true, completion: nil)
}

解雇可能发生在第一个和第二个ViewController中。

想象一下情况:

  1. 用户登录并在解除第二个VC
  2. 后返回主应用程序
  3. 正在从数据库中删除设备
  4. 检查后,用户需要再次登录
  5. forceLogin()和......
  6.   

    libc ++ abi.dylib:以NSException类型的未捕获异常终止

    使用self.present(navController, animated: true, completion: nil)时会发生这种情况。

    我有一些想法可能导致崩溃,但我不确定:

    1. 在代码中创建导航控制器而不是在storyboard中
    2. 解雇是不够的 - 故事板不知何故停留在内存中,无法再次实例化
    3. 导致问题的原因是什么?如何避免崩溃?

      如果需要更多信息,请询问。

1 个答案:

答案 0 :(得分:2)

我总是忘记这一点。请记住这样的界面任务:

DispatchQueue.main.async {
   self.present(navController, animated: true, completion: nil)
}