[英]Presenting a view in a ViewController that is in a UITabBarController
[英]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.