【问题标题】:XCode 9: Setting RootViewController in AppDelegate causes black screen after launching the applicationXCode 9:在 AppDelegate 中设置 RootViewController 会导致启动应用程序后出现黑屏
【发布时间】:2018-03-21 13:25:21
【问题描述】:

我目前正在更新我的应用程序以兼容 iOS 11。

在我的应用程序中,我在 AppDelegate didFinishLaunchingWithOptions 中设置了 rootViewController,如下所示:

self.window.rootViewController = MainViewController()
self.window.makeKeyAndVisible()

在我的 MainViewController 中,我确定启动时应该作为初始视图控制器的 VC

  1. 如果不存在令牌 -> 转到 LoginViewController
  2. 如果令牌仍然有效 -> 转到 HomeViewController

这是我的 MainViewController 的 viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    // main tab bar controller
    self.initTabBarMainController()

    // login page
    self.initLoginViewController()

    // checking the session
    let tokenExpired = SessionManager.sharedInstance.isTokenExpired()
    if Utilities.isLoggedIn() && SessionManager.sharedInstance.getSessionToken() != nil && !tokenExpired 
    {
      self.addChildViewController(self.mainTabViewController!)
      self.view.addSubview((self.mainTabViewController?.view)!)
    } else {
      self.addChildViewController(self.loginViewController!)
      self.view.addSubview((self.loginViewController?.view)!)
    }

    self.setupNotifications()

  }

但是,在 iOS 11 中,当我尝试运行它时。它只启动应用程序并卡在黑屏。

注意事项:

  1. 应用未挂起,手机未挂起。该应用似乎不再加载视图。
  2. 它转到了正确 ViewController 的 viewDidLoad()
  3. 我确信这是问题所在,因为当我尝试删除此代码并让应用程序在启动后转到其 MainInterface 时,没有问题。

【问题讨论】:

    标签: ios iphone swift xcode9


    【解决方案1】:

    尝试以下代码使其可见:

    self.window.rootViewController = MainViewController()
    self.window.makeKeyAndVisible()
    

    MainViewControllerviewDidLoad中:

    override func viewDidLoad() {
        super.viewDidLoad()
        // main tab bar controller
        self.initTabBarMainController()
    
        // login page
        self.initLoginViewController()
    
        // checking the session
        let tokenExpired = SessionManager.sharedInstance.isTokenExpired()
        var presentedViewController: UIViewController? = nil
        if Utilities.isLoggedIn() && SessionManager.sharedInstance.getSessionToken() != nil && !tokenExpired 
        {
          presentedViewController = self.mainTabViewController!
        } else {
          presentedViewController = self.loginViewController!
        }
    
        self.addChildViewController(presentedViewController!)
        presentedViewController!.view.frame = self.view.frame
        self.view.addSubview(presentedViewController!.view)
    
        self.setupNotifications()
    
    }
    

    【讨论】:

    • 对不起,我也试过了,但仍然没有解决问题。我将编辑问题以避免混淆
    • 是您自己创建的窗口还是通过情节提要加载的? + 你能提供整个didFinishedLaunching 方法的实现给我们更多的上下文吗?
    • 我编辑了我的问题以显示我的 MainViewController 的 viewDidLoad。 didFinishedLaunching的相关代码只是你提到的那两行代码
    • 确认 MainViewController 正确显示,方法是在调试器中使用 Capture View Hierarchy,或者将其背景颜色设置为例如红色..
    • 我刚刚通过更改背景颜色进行了尝试。它正确呈现。初始化后我还检查了 LoginViewController 和 MainTabBarVC 的视图框架,一切正常。我会尝试看看问题是否出在我添加 childViewController 的代码中。
    【解决方案2】:

    编辑:大家好,它似乎只发生在 XCode 9 模拟器上。我今天再次尝试使用 iOS 11 版本的不同手机。工作正常。


    我通过处理我的 AppDelegate 中的所有内容而不使用容器视图来决定是否显示 loginVC 或 MainTabVC 来解决问题

    1. 在我的 AppDelegate 中初始化 MainTabBarVC 和 LoginVC
    2. 在我的 AppDelegate 中设置登录和注销通知
    3. 在我的 AppDelegate 中处理 rootViewController 的交换
    4. 我的 AppDelegate 中现有令牌的检查器

    我现在将使用它,因为我认为 XCode 9 或 iOS 11 中存在一个错误,不允许我在单独的 ViewController 中处理此问题,我将它们添加为 childViewController,就像我之前的做法一样。

    希望它可以尽快以最好的方式解决。 拥挤的 AppDelegate 令人眼花缭乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-22
      • 2019-01-16
      • 2020-03-20
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多