1

ViewDidLoad在 a 上的方法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方法 inHomeVC被调用两次,而它只被调用一次 for LoginVC

我已经尝试在文章中搜索viewDidLoad 被调用了两次,并且viewDidLoad 在启动时在 rootViewController 上被调用了两次,但无法解决这个问题。

4

2 回答 2

3

当您从情节提要创建导航视图控制器时,这已经包含它rootViewController(不能与rootViewControllerof混淆UIWindow)。我想这是你的HomeVC(在故事板中)。因此,情节提要魔术已经创建HomeVC,您不必在didFinishLaunchingWithOptions.

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

如果您想以编程方式执行此操作,那么 - 在情节提要中 - 您应该删除导航控制器,并instantiateViewControllerdidFinishLaunchingWithOptions. 您还可以在此处添加适当的根视图控制器(从情节提要中实例化),可能像这样:

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()
于 2018-11-19T08:21:39.593 回答
0

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

使用 segue 登录 homeview。

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

考虑HomeViewIdentifier是一个segueIdfor LoginViewto HomeView。为什么我建议这样做,因为您需要回到loginView用户注销的时间。如果您这样做homeViewrootview那么您将在注销的情况下去哪里。

于 2018-11-19T08:26:25.650 回答