我在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 twice和viewDidLoad getting called twice on rootViewController at launch,但是无法解决问题。
答案 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)
}
考虑HomeViewIdentifier
是segueId
到LoginView
的{{1}}。
我之所以建议这样做,是因为您需要在用户注销时重新回到HomeView
。如果您将loginView
设为homeView
,那么在注销的情况下会去哪里。