[英]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.