[英]viewDidLoad called twice, using navigation controller
我在ViewController
上的ViewDidLoad
方法被調用了兩次,但僅在特定情況下才被調用。 我需要介紹兩種視圖控制器,一種是用戶未登錄時,另一種是用戶登錄時。我正在使用情節提要,並將導航控制器設置為其中的初始視圖控制器。
在我的AppDelegate
didFinishLaunchingWithOptions
方法中,我使用所需的控制器填充了ViewControllers
數組,如下所示
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let navigationController = storyboard.instantiateViewController(withIdentifier: "navController") as! UINavigationController
if UserDefaults.standard.object(forKey: USERID) != nil {
viewController = storyboard.instantiateViewController(withIdentifier: "HomeVC_ID") as! HomeVC
}
else {
viewController = storyboard.instantiateViewController(withIdentifier: "LoginVC_ID") as! LoginVC
}
navigationController.viewControllers = [viewController] as! [UIViewController]
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()
ViewDidLoad
的方法HomeVC
被調用了兩次,而這就是所謂的只是一次LoginVC
。
我已經嘗試搜索文章兩次,在啟動時在rootViewController上兩次 調用 viewDidLoad,兩次 調用 viewDidLoad,但是無法解決問題。
當您從情節rootViewController
創建導航視圖控制器時,該控制器已經包含了它的rootViewController
(一定不要與UIWindow
的rootViewController
混淆)。 我猜這是您的HomeVC
(在情節HomeVC
中)。 因此,情節HomeVC
魔術已經創建了HomeVC
,您不必在didFinishLaunchingWithOptions
手動創建它。
如果您已將故事板指定為項目/目標屬性中的主界面,則在didFinishLaunchingWithOptions
不需要任何創建代碼,只需讓框架執行魔術即可。
如果你想這樣做編程,然后-故事板-你應該刪除導航控制器,並手動創建(不是通過instantiateViewController
)在didFinishLaunchingWithOptions
。 您還可以在此處(從情節提要中實例化)添加適當的根視圖控制器,如下所示:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if UserDefaults.standard.object(forKey: USERID) != nil {
viewController = storyboard.instantiateViewController(withIdentifier: "HomeVC_ID") as! HomeVC
} else {
viewController = storyboard.instantiateViewController(withIdentifier: "LoginVC_ID") as! LoginVC
}
let navigationController = UINavigationController(rootViewController:viewController)
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()
我建議不要在應用程序委托中進行任何手動segue或加載視圖控制器。 在LoginView的viewDidLoad中使用以下代碼(希望這始終是您應用程序的根視圖)。
使用segue登錄到家庭視圖。
if UserDefaults.standard.object(forKey: USERID) != nil {
self.performSegue(withIdentifier: "HomeViewIdentifier", sender: self)
}
考慮到HomeViewIdentifier
是LoginView
到HomeView
的segueId
。 為什么我建議這樣做,因為您需要在用戶注銷時重新選擇登錄loginView
。 如果您將homeView
為rootview
那么在注銷的情況下您將去哪兒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.