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

Ios 使用导航控制器调用viewDidLoad两次,ios,swift,uinavigationcontroller,rootviewcontroller,Ios,Swift,Uinavigationcontroller,Rootviewcontroller,在ViewController上调用我的ViewDidLoad方法两次,但仅在特定场景中调用。我需要提供两个视图控制器,一个是用户未登录时的视图控制器,另一个是用户登录时的视图控制器。我正在使用故事板,并在其中设置了一个导航控制器作为初始视图控制器 在我的AppDelegatedidfishlaunchingwithoptions方法中,我用所需的控制器填充了ViewControllers数组,如下所示 let storyboard = UIStoryboard(name: "Main", bu

ViewController
上调用我的
ViewDidLoad
方法两次,但仅在特定场景中调用。我需要提供两个视图控制器,一个是用户未登录时的视图控制器,另一个是用户登录时的视图控制器。我正在使用故事板,并在其中设置了一个导航控制器作为初始视图控制器

在我的
AppDelegate
didfishlaunchingwithoptions
方法中,我用所需的控制器填充了
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()
HomeVC
中的
ViewDidLoad
方法调用两次,而
LoginVC
只调用一次


我已经尝试过搜索文章,但无法解决这个问题。

当您从故事板创建导航视图控制器时,它已经包含了它的
rootViewController
(不能与
ui窗口的
rootViewController
混淆)。我猜这是你的
HomeVC
(在故事板中)。因此,故事板魔术已经创建了
HomeVC
,您不必在
didFinishLaunchingWithOptions
中手动创建它

如果您已在项目/目标的属性中将情节提要指定为您的主界面,则在
didfishlaunchwithoptions
中不需要任何创作代码,只需让框架发挥魔力即可

如果您希望以编程方式执行此操作,那么-在故事板中-您应该卸下导航控制器,并在
didfishlaunchingwithoptions
中手动创建它(而不是通过
instantialeviewcontroller
)。您还可以在此处添加适当的根视图控制器(从情节提要中实例化),可能如下所示:

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()

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

使用segue登录homeview

if UserDefaults.standard.object(forKey: USERID) != nil {
     self.performSegue(withIdentifier: "HomeViewIdentifier", sender: self)
}
考虑到
HomeView标识符
LoginView
HomeView
segueId

我之所以建议这样做,是因为当用户注销时,您需要返回到
loginView
。如果您将
homeView
设置为
rootview
,那么在注销的情况下您将去哪里。

我认为这是由于故事板中的segue。我已经为导航控制器勾选了“是初始视图控制器”。没有使用其他segue。如果我删除它,加载时会显示一个黑屏。如果以编程方式设置根视图控制器,则从部署信息中删除主界面。
UITabViewController
可能更适合您的UI设计。您可以隐藏tab按钮并通过代码控制它。@JatinKathrotiya删除“主故事板文件基名称”会在启动后显示一个黑屏。谢谢。我从情节提要中删除了导航控制器,并手动创建了相同的导航控制器,但问题仍在重复。当控件直接进入HomeVC时,在自动登录时,viewDidLoad只会根据需要调用一次。但在第一次登录的情况下,当它从LoginVC导航时,它会被调用两次。