簡體   English   中英

使用Swift和iOS 8 Storyboard登錄屏幕

[英]Login Screen with Swift and 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(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
}

這是我做的,它工作正常:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if (!AppData.sharedInstance.loggedIn) {
        let signInNavigation = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("SignInNavigationControllerIdentifier") as? UINavigationController
        self.window!.rootViewController = signInNavigation;
    }
    return true
}

為LoginViewController設置Is Initial View Controller

在此輸入圖像描述

AppDelegate.swift刪除並將其放在LoginViewController

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)
    }

運行您的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM