我在处理iOS应用程序的登录流程时遇到了很多麻烦.我想要实现的故事板的图像如下
我正在尝试实现一个可选的登录屏幕,该屏幕仅在用户首次打开应用程序并且尚未登录时显示.目前,我将Tab Bar Controller设置为根视图控制器.但是,我无法弄清楚如何处理这些视图控制器之间的交换.
我试图用以下代码简单地按下登录屏幕.但是,它不起作用.我相信标签栏控制器不允许推送新视图控制器的问题.
func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //stuff if userLoggedIn { // Do nothing } else { //get access to login view var storyboard = UIStoryboard(name: "Main",bundle: nil) var viewController = storyboard.instantiateViewControllerWithIdentifier("signupView") as UIViewController; // Then push login view var rootViewController = self.window!.rootViewController as UITabBarController; rootViewController.pushViewController(viewController,animated: true) } // Override point for customization after application launch. return true }
有没有办法在不推入导航控制器的情况下切换视图控制器?任何关于如何处理这种登录流程的建议将不胜感激.
我通过“LaunchViewController”来实现这个目的,它确定它是否应该呈现Login视图或主导航控制器.
原文链接:https://www.f2er.com/swift/318678.html将启动视图标记为故事板中的初始视图,并在其中编写逻辑以确定要显示的内容.对于用户来说,该过程通常非常快速且不明显.
更新:
正如我在评论中所提到的,我走的是另一个方向.现在在App Delegate的应用程序(application:didFinishLaunchingWithOptions :)方法中,我执行必要的逻辑来确定哪个视图应该是rootViewController并使用以下内容将其设置在那里.
extension AppDelegate { enum LaunchViewController { case Login,Dashboard var viewController: UIViewController { switch self { case .Login: return StoryboardScene.Login.LoginScene.viewController() case .Dashboard: return StoryboardScene.Dashboard.initialViewController() } } /// Sets `UIWindow().rootViewController` to the appropriate view controller,by default this runs without an animation. func setAsRootviewController(animated animated: Bool = false) { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate let window = appDelegate.window! let launchViewController = viewController log.info?.message("Setting \(launchViewController.dynamicType) as rootViewController") if let rootViewController = window.rootViewController where rootViewController.dynamicType != launchViewController.dynamicType && animated { let overlayView = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false) launchViewController.view.addSubview(overlayView) UIView.animateWithDuration(0.3,animations: { overlayView.alpha = 0.0 },completion: { _ in overlayView.removeFromSuperview() }); } window.rootViewController = launchViewController window.restorationIdentifier = String(launchViewController.dynamicType) if window.keyWindow == false { window.makeKeyAndVisible() } } } }
请注意,StoryboardScene不是默认类型,我使用https://github.com/AliSoftware/SwiftGen来生成它.
My App Delegate方法看起来像这样.
if window == nil { window = UIWindow(frame: UIScreen.mainScreen().bounds) } if isRestoringState == false { if let _ = lastUsedAccount { LaunchViewController.Dashboard.setAsRootviewController() } else { LaunchViewController.Login.setAsRootviewController() } }
func handlelogout(notification: NSNotification) { LaunchViewController.Login.setAsRootviewController(animated: true) lastUsedAccount = nil }