我在一个应用程序中也有类似的问题要解决,我使用了以下方法。我没有使用通知来处理导航。
我在应用程序中有三个故事板。
启动画面故事板-用于应用程序初始化和检查用户是否已经登录
登录故事板——用于处理用户登录流程
标签栏故事板-用于显示应用程序内容
我在应用程序中的初始故事板是启动画面故事板。
我有导航控制器作为根登录和选项卡栏故事板处理视图控制器导航。
我创建了一个Navigator类来处理应用程序导航,它看起来像这样:
class Navigator: NSObject {
static func moveTo(_ destinationViewController: UIViewController, from sourceViewController: UIViewController, transitionStyle: UIModalTransitionStyle? = .crossDissolve, completion: (() -> ())? = nil) {
DispatchQueue.main.async {
if var topController = UIApplication.shared.keyWindow?.rootViewController {
while let presentedViewController = topController.presentedViewController {
topController = presentedViewController
}
destinationViewController.modalTransitionStyle = (transitionStyle ?? nil)!
sourceViewController.present(destinationViewController, animated: true, completion: completion)
}
}
}
}
让我们来看看可能的场景:
首次应用发行;
启动屏幕将加载,我检查用户是否已经登录。然后登录屏幕将使用Navigator类加载,如下所示;
因为我有导航控制器作为根,我实例化导航控制器作为初始视图控制器。
let loginSB = UIStoryboard(name: "splash", bundle: nil)
let loginNav = loginSB.instantiateInitialViewcontroller() as! UINavigationController
Navigator.moveTo(loginNav, from: self)
这将从应用程序窗口的根目录中删除slpash故事板,并将其替换为登录故事板。
在登录故事板中,当用户成功登录时,我将用户数据保存到user Defaults中,并初始化UserData单例来访问用户详细信息。然后使用navigator方法加载标签栏故事板。
Let tabBarSB = UIStoryboard(name: "tabBar", bundle: nil)
let tabBarNav = tabBarSB.instantiateInitialViewcontroller() as! UINavigationController
Navigator.moveTo(tabBarNav, from: self)
现在用户从标签栏的设置屏幕中退出。我清除所有保存的用户数据,并导航到登录屏幕。
let loginSB = UIStoryboard(name: "splash", bundle: nil)
let loginNav = loginSB.instantiateInitialViewcontroller() as! UINavigationController
Navigator.moveTo(loginNav, from: self)
用户登录并强制杀死应用程序
当用户启动应用程序时,启动画面将被加载。我检查用户是否已登录,并从用户默认中访问用户数据。然后初始化UserData单例,显示标签栏而不是登录屏幕。