打破UINavigationController

时间:2017-09-03 21:11:36

标签: ios swift xcode

我有一个故事板指定登录我的应用程序。我把它嵌入在UINavigationController中。登录我的应用程序(并转换到新的故事板)后,我想“突破”此导航控制器(即在我登录后,我不再希望能够返回登录屏幕)。我想要用另一个导航控制器替换导航控制器 - 一旦我达到这一点,我根本就不需要导航控制器。

处理此问题的最佳方法是什么?谢谢!

仅供参考:使用Swift 3

2 个答案:

答案 0 :(得分:4)

我在我的应用程序中完成此操作的方法是为身份验证部件安装导航控制器,然后为主应用程序安装另一个导航控制器。

因此,一旦我的用户登录,我将使用新的导航控制器替换根视图控制器并将初始VC设置为显示:

APIClient.authenticate(username, password) { result in 
   if result, let appDelegate = UIApplication.delegate as? AppDelegate {]
      let mainNav = MainNavigationController()
      let mainVC = MainViewController()
      mainNav.setViewControllers([mainNav])
      appDelegate.window?.rootViewController = mainNav
   }
}

然后您的AuthNavigation控制器将被取消,用户将无法导航回应用程序的身份验证部分。

此方法可有效重置视图层次结构。当您完成身份验证流程时,您将把项目推送到导航堆栈。

完成身份验证流程后,最有效的方法是创建新的导航堆栈并用此替换根控制器。然后,旧堆栈中的所有VC将被解除初始化并从内存中删除,并且您的新导航堆栈将不会知道它们中的任何内容。将新导航和主应用程序视图控制器置于其顶层,这就是您想要的。

答案 1 :(得分:1)

我认为处理这种情况的最佳做法是在启动屏幕后使您的登录视图成为根(不包含在导航控制器中),因此当您完成登录过程时,只需显示您的UINavigationController。 这在所有情况下都很好,你的root现在是你的导航控制器你不能回到登录界面,直到你解雇你的导航控制器(你可以用它来退出)