使用Swift和iOS 8 Storyboard登录屏幕

前端之家收集整理的这篇文章主要介绍了使用Swift和iOS 8 Storyboard登录屏幕前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在处理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视图或主导航控制器.

将启动视图标记为故事板中的初始视图,并在其中编写逻辑以确定要显示内容.对于用户来说,该过程通常非常快速且不明显.

更新:

正如我在评论中所提到的,我走的是另一个方向.现在在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()
    }
}

使用logout方法更新注释

func handlelogout(notification: NSNotification) {
  LaunchViewController.Login.setAsRootviewController(animated: true)
  lastUsedAccount = nil
}
原文链接:https://www.f2er.com/swift/318678.html

猜你在找的Swift相关文章