簡體   English   中英

Swift:通過UITabBarController呈現一個viewController

[英]Swift: Presenting a viewController over UITabBarController

應用程序啟動完成后,如果當前用戶未登錄,我希望我的應用程序打開LoginViewController 。否則,它將進入索引為0(默認值)的ViewController 因此,如果未登錄,則顯示UITabBarController的模式視圖。

我最初的ViewController是一個UITabBarController ,這是在創建UIStoryboard 它被選中標記為“ Initial View並以圖形方式連接到其他五個Initial View控制器。

實際上,我想我知道LoginViewController不出現的原因。 這是因為值結果為nil(我在控制台中檢查了)。 但為什么?? 除了這種行為,一切都運行良好。 UITabBarController似乎可以正常工作。

我的LoginViewController嵌入了UINavigationViewController 這段代碼位於ViewController內,該索引的選定索引為0。將其放入viewDidAppear()方法中

 let main = UIStoryboard(name: "Main", bundle: nil)
 let view = main.instantiateViewController(withIdentifier: "login") as! LoginViewController
 let nav = UINavigationController(rootViewController: view)
 self.tabBarController?.present(nav, animated: false, completion: nil)

但是,它不起作用。

窗口RootViewController的更改的UINavigationController如果用戶沒有登錄,如果他是將其更改為tabBarController

導航到任何視圖控制器之前,您應該實現確定所需的初始視圖控制器為根的邏輯(基於用戶是否登錄), application(_:didFinishLaunchingWithOptions :)方法適用於這種情況。實施:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // let's assume that you are recognizing if the user logged in by a flag called 'isLoggedin':

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    if isLoggedin { // show display main view controller
        let mainViewController = storyboard.instantiateViewController(withIdentifier: "mainViewController")
        // setup any needed config for mainViewController...
        self.window?.rootViewController = mainViewController
    } else { // display login view controller
        let loginViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController")
         // setup any needed config for loginViewController...
        self.window?.rootViewController = loginViewController
    }

    self.window?.makeKeyAndVisible()

    return true
}

或作為較短的版本:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let isLoggedin = false

    let initialViewController = storyboard.instantiateViewController(withIdentifier: isLoggedin ? "mainViewController" : "loginViewController")
    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}

此時,應用程序啟動完成后(尚未跳轉到任何視圖控制器),將根據用戶登錄驗證顯示初始視圖控制器。 我認為除非有特定要求在選項卡控制器的上顯示登錄視圖控制器,否則它將是一個更好的行為。 從邏輯上講,如果用戶尚未登錄,則甚至無需導航至標簽欄控制器。

我運行您的代碼,這是問題:

2018-01-18 16:23:52.845273 + 0800 try [8180:315334]警告:嘗試呈現不在其窗口層次結構中的視圖!

 self.tabBarController?.present(nav, animated: false, completion: nil)

這條線是非常有線的。 我很少看到。

因此,您還可以讓self.tabBarController的子控制器呈現nav

選擇選項卡欄之一。

暫無
暫無

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

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