在if else语句之后出现带有viewDidLoad的黑屏

问题描述

我希望我的应用在启动时有条件地检查变量是否正确。基于此,它应该转到简介屏幕(在我的情况下,他可以在其中选择一个变量,然后选择一个团队),或者应该启动主视图。搜索后,我找到了此代码并对其进行了编辑。但是似乎仍然有问题。首先,我没有两个标识符。简介有一个主视图,但没有主视图。我的主视图称为WeatherViewController,“简介”屏幕称为FirstScreenViewController。我还添加了Main.storyboard的图片。 我也用Google搜索了很多关于条件UINavigationController的信息,但是我只能通过视频来理解,但是没有找到关于它的视频。

我尝试使用here.中的代码

var id = hello ? "goToIntro" : "???"
  self.window = UIWindow(frame: UIScreen.main.bounds)
  let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
  let WeatherViewController: UIViewController = mainStoryboard.FirstScreenViewController(withIdentifier: WVC has no identifier??) as UIViewController
  self.window?.rootViewController = WeatherViewController
  self.window?.makeKeyAndVisible()
   if hello {
      self.performSegue(withIdentifier: "goToIntro",sender: self)
    } else {
/here nothing should happen. It should open the Main View
      self.performSegue(withIdentifier: "???",sender: self)
    }

Main.Storyboard

解决方法

注意:此答案是指试图在loadView()内进行搜索的原始问题(进行任何编辑之前)。


您应该在loadView中手动创建控制器的视图。您目前无所事事,因此黑屏。此外,如果您使用情节提要(storyboard)或xib来管理此控制器,则完全不应覆盖loadView

说过,将分支逻辑移回“某物”(例如UINavigationController或自定义的容器控制器,甚至直接设置您的根控制器)可能是一个更好的主意。窗口(如果有意义),它将根据某种条件显示(或设置)A或B,从而避免完全加载此控制器(请记住,在代码中,控制器已初始化,它将成为层次结构的一部分,并且所有的生命周期方法 都将被调用,即使您直接与另一个方法进行了交互)

最后,如果您出于某种原因决定覆盖loadView,而不必自己调用viewDidLoad,则系统将调用此方法。