我正在构建一个应用程序,我决定在多个Storyboard文件中构建我的用户界面。每个故事板都是一组类似的动作。例如,LogInStoryboard
包含用于登录和注册用户的视图。
我遇到了一些问题,导航到一个新的故事板并解雇所有以前的视图控制器以便在我自己之后进行清理。
这是我的数据流:
1)应用程序启动到日志视图中。根视图控制器为LogInViewController
,位于LogInStoryboard
。
2)用户点击注册按钮召唤模态RegistrationViewController
,同时也住在LogInStoryboard
。
3)用户完成注册并自动登录。
此时,视图控制器堆栈为[LogInViewController, RegistrationViewController]
。注册后,用户将自动登录,因此我想导航到他们的主屏幕HomeViewController
。但是,HomeViewController
位于另一个故事板HomeStoryboard
内。
我想解雇LogInViewController
和RegistrationViewController
,然后我想从HomeViewController
实例化HomeStoryboard
并展示它。这样我就有了一个简单的视图控制器堆栈,LogInStoryboard
视图控制器都可以解除分配。
实现这种流程的最佳方法是什么?或者我是否应该如此担心那些旧的视角控制器?
答案 0 :(得分:3)
通常情况下,您的登录流程几乎就像一个完全独立的应用程序,其唯一的功能是对用户进行身份验证并将用户信息写入数据库。在这种情况下,当您完成登录而不是执行segue时,您想要做的是用HomeViewController
替换整个视图层次结构。要执行此操作,您只需调用UIApplication.shared.keyWindow! = UIStoryboard(name: "HomeStoryboard", bundle: nil).instantiateInitialViewController()
(假设您将HomeViewController
设置为初始视图控制器)。当然这没有动画,并且有点难看,所以你想要使用UIView.transition(with:duration:options:animations:completion:)来改变动画。例如:
UIView.transition(with: UIApplication.shared.keyWindow!, duration: 0.25, options: .transitionCrossDissolve,
animations: {
UIApplication.shared.keyWindow!.rootViewController = UIStoryboard(name: "HomeStoryboard", bundle: nil).instantiateInitialViewController()
})
答案 1 :(得分:1)
Swift 4.0
我将从HomeViewController开始作为初始视图控制器。 然后从那里创建 LogInViewController 。
if shouldLogin {
let storyboard = UIStoryboard(name: "LogInStoryboard", bundle: nil)
let loginVCtrl = storyboard.instantiateViewController(withIdentifier: "yourLogInViewControllerID")
present(loginVCtrl, animated: true)
}
用户完成登录/注册过程后,您可以致电:
dismiss(animated: true)
因此,您的ViewController堆栈如下所示:
答案 2 :(得分:0)
将您的HomeViewController
设置为appdelegate
navigationcontroller
并将navigationcontroller
设为rootviewcontroller
注意:这两项操作均在appdelegate