在 Scenedelgate 中设置视图控制器后 Xcode 11.5 IOS 13.5 黑屏

Posted

技术标签:

【中文标题】在 Scenedelgate 中设置视图控制器后 Xcode 11.5 IOS 13.5 黑屏【英文标题】:Xcode 11.5 IOS 13.5 Dark screen after setting view controller in Scenedelgate 【发布时间】:2020-08-08 05:22:21 【问题描述】:

初学者提醒:我正在使用 ios 13.6 进行 Swift 11.6。我是 Swift 的初学者,我正在尝试检查我的用户以前是否登录过。为此,我使用了用户默认值,这似乎工作正常。问题是当我在 Scenedelgate 中初始化我的视图控制器时,它似乎无法正常工作 - 我只得到一个黑屏。

另一个注意事项是我的主屏幕上有一个侧边菜单,所以我尝试初始化 UINavigationController,然后在其中初始化 HomeViewController

这是我的场景委托代码:

class SceneDelegate: UIResponder, UIWindowSceneDelegate 

var window: UIWindow?
var storyboard: UIStoryboard?
var view: UIView?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 

         guard let _ = (scene as? UIWindowScene) else return
    let def = UserDefaults.standard
               let is_authenticated = def.bool(forKey: "is_authenticated") // return false if not found or stored value

               if is_authenticated 
                   // user logged in
                self.view?.window?.rootViewController = UINavigationController(rootViewController: HomeViewController())
                self.view?.window?.makeKeyAndVisible()
                   

编辑 1: 这是我的用户默认函数的样子:

 func saveLoggedState() 

    let def = UserDefaults.standard
    def.set(true, forKey: "is_authenticated") // save true flag to UserDefaults
    def.synchronize()


编辑 2: Here's how my simulator looks

编辑 3: Here's how my view controller looks

编辑 4: 所以这就是问题所在。我决定尝试以编程方式将主视图控制器设置为白色,这显然有效。那么让我感到困惑的是,我在 HomeViewController 和 SideMenuNavigationController 中都看不到任何内容。我放了一个按钮和一个标签,但它们没有显示出来。

感谢您提供的任何建议。我是一个完整的新手,所以我真的不知道我在做什么。任何帮助表示赞赏。

谢谢!

【问题讨论】:

一个场景代理没有视图,给它一个也没有任何作用,那么谈论它的视图有什么意义呢?同样,场景委托没有情节提要。一般的代码没有意义。如果问题是如何在场景委托中进行登录屏幕,我在这里有一个工作示例:github.com/mattneub/RegistrationExample/tree/master/… 至于视图控制器的黑度,你的视图控制器没有显示任何东西,我们怎么知道它不是黑的?据我们所知,您的代码运行完美 您好,感谢您的建议。我将在编辑中添加我的主视图控制器的外观,希望对您有所帮助。 【参考方案1】:

这一行是错误的:

self.view?.window?.rootViewController = UINavigationController(rootViewController: HomeViewController())

问题在于代码中的这个短语:

HomeViewController()

这会创建一个新的空白 HomeViewController,而不是您在情节提要中设计的实例。要获取该实例,请告诉故事板为您实例化它。

【讨论】:

看看我关于这个主题的文章,programmingios.net/dont-make-a-new-instance-by-mistake-2 谢谢!我完全没有意识到这一点。欣赏它 抱歉,我尝试接受他们两个的解决方案,但没有成功,我将其更改为您的解决方案!对于那个很抱歉。我是堆栈溢出的新手。 如果你想知道,我尝试接受 Fabio 的,因为最初我使用的是 self 和 view 而不是 window。再次感谢你们的帮助! 我不是说你应该接受我的,我是说另一个答案是错误的,因为它和你的错误完全相同,所以它不可能是正确的。你自己说它让你和以前一样黑屏。【参考方案2】:

尝试像这样添加 windowScene 并正确显示根控制器:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 

     guard let windowScene = (scene as? UIWindowScene) else return

     let def = UserDefaults.standard
     let is_authenticated = def.bool(forKey: "is_authenticated") // return false if not found or stored value

      if is_authenticated 
      // user logged in
      window = UIWindow(windowScene: windowScene)
      window?.makeKeyAndVisible()
      let controller = UINavigationController(rootViewController: HomeViewController())
      window?.rootViewController = controller
    
 

如果您的用户默认设置正确,那么 HomeViewController() 会显示...

【讨论】:

嗨,我刚试过这样做,但我仍然有同样的黑屏。还有人可以帮忙吗? 你把代码全部复制粘贴了吗?因为它完美运行!!! HomeController 中有什么?它是一个空控制器吗? 不要更正您的代码,复制并粘贴我的代码...您是在情节提要中设计 UI 还是以编程方式设计 UI? 嗨法比奥!感谢您抽出时间再次回复。 HomeController 在导航控件中有一个用于侧边菜单的条形按钮,如果它有效,您应该会在角落看到一个带有按钮的白色菜单。你想让我删除原始代码然后添加你的吗?因为那是我为我所做的。此外,我正在以情节提要和编程方式设计 UI,尽管它主要是在情节提要中。 看事情是,它不是全黑的。您可以在顶部看到一个白条,这意味着有一个导航栏,但问题是实际的主屏幕是黑色的。任何想法为什么?我会尝试发送屏幕截图。

以上是关于在 Scenedelgate 中设置视图控制器后 Xcode 11.5 IOS 13.5 黑屏的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器中设置表格视图

在 UITabbarController 中设置视图控制器的委托

在标签栏控制器中设置视图控制器

在 Swift 的导航栏中设置图像

如何在 NHRangeSlider 中设置以前的值?

如何在 SwiftUI 中设置视图中的控制器