簡體   English   中英

使用導航控制器兩次調用viewDidLoad

[英]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 (一定不要與UIWindowrootViewController混淆)。 我猜這是您的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)
}

考慮到HomeViewIdentifierLoginViewHomeViewsegueId 為什么我建議這樣做,因為您需要在用戶注銷時重新選擇登錄loginView 如果您將homeViewrootview那么在注銷的情況下您將去哪兒。

暫無
暫無

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

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