使用导航控制器两次调用viewDidLoad

时间:2018-11-19 08:02:35

标签: ios swift uinavigationcontroller rootviewcontroller

我在ViewDidLoad上的ViewController方法被调用了两次,但仅在特定情况下才被调用。我需要介绍两种视图控制器,一种是用户未登录时,另一种是用户登录时。我正在使用情节提要,并将导航控制器设置为其中的初始视图控制器。

在我的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仅被调用一次。

我已经尝试搜索文章viewDidLoad is called twiceviewDidLoad getting called twice on rootViewController at launch,但是无法解决问题。

2 个答案:

答案 0 :(得分:2)

从情节提要中创建导航视图控制器时,它已经包含了rootViewController(一定不要与rootViewController的{​​{1}}混淆)。我猜这是您的UIWindow(在情节提要中)。因此,情节提要魔术已经创建了HomeVC,而您不必在HomeVC中手动创建它。

如果您已将情节提要板指定为项目/目标属性中的主要界面,则didFinishLaunchingWithOptions中不需要任何创建代码,只需让框架执行魔术即可。

如果要以编程方式执行此操作,则-在情节提要中-应该删除导航控制器,并在didFinishLaunchingWithOptions中手动创建(而不是通过instantiateViewController)。您还可以在此处(从情节提要中实例化)添加适当的根视图控制器,如下所示:

didFinishLaunchingWithOptions

答案 1 :(得分:0)

我建议不要在应用程序委托中进行任何手动搜索或加载视图控制器。在LoginView的viewDidLoad中使用以下代码(希望这始终是您应用程序的根视图)。

使用segue登录到家庭视图。

if UserDefaults.standard.object(forKey: USERID) != nil {
     self.performSegue(withIdentifier: "HomeViewIdentifier", sender: self)
}

考虑HomeViewIdentifiersegueIdLoginView的{​​{1}}。 我之所以建议这样做,是因为您需要在用户注销时重新回到HomeView。如果您将loginView设为homeView,那么在注销的情况下会去哪里。