使用Xcode 11.2中的故事板以编程方式设置初始视图控制器。

6

我正在尝试以编程方式设置初始视图控制器,但我一直收到这个错误。有什么解决办法吗?

2019-11-07 11:47:43.975990+0000 RestaurantApp[16319:147412] [WindowScene] Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?

这是我编写的代码。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {


    let window = UIWindow()
    let locationService = LocationService()
    let storyboard = UIStoryboard(name: "Main", bundle: nil) //refernce to our storyboard





    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        //setiing the root view control on our window
        switch locationService.status  {
        case .notDetermined, .denied, .restricted:
            let LocationViewController =
                storyboard.instantiateViewController (withIdentifier: "LocationViewController") as? LocationViewController
            LocationViewController?.locationService = locationService
                window.rootViewController = LocationViewController
        default:
            assertionFailure()
        }

        window.makeKeyAndVisible()

        return true
    }
}

这是我故事板的图片:

在此输入图片描述


你能发布你的故事板结构吗? - Maulik Pandya
你的Storyboard的名称真的是“Main”吗? - Daniel Storm
4个回答

16

iOS 13已将窗口设置从AppDelegate移至SceneDelegate,以支持使用(可能多个)场景而不是单个窗口。 现在您需要像这样进行设置:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   var window: UIWindow?
   let storyboard = UIStoryboard(name: "Main", bundle: nil)

   func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
      guard let windowScene = scene as? UIWindowScene else { return }
      let vc = storyboard.instantiateViewController (withIdentifier: "Primary") as! ViewController
      window = UIWindow(windowScene: windowScene)
      window?.rootViewController = vc
      window?.makeKeyAndVisible()
   }

我想从另一个视图控制器更改rootViewController。所以,你能否提供代码建议?例如:从应用程序注销并显示登录屏幕,或者登录并将主屏幕与左侧菜单设置为根视图控制器。 - Sagar Chauhan
那是一个单独的话题,所以我不想在这个评论中深入讨论。这可能会有所帮助,因为它具有类似的需求 https://stackoverflow.com/questions/58845347/performing-a-completion-handler-before-app-launches 或者提出另一个问题。 - flanker

4
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
            let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
     let homeView =  storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
     self.window?.rootViewController = homeView
    return true
}

这对我有效


1
这个错误是由于你的故事板中出现了一个简单的错误,很容易修复。当你的应用程序启动时,iOS需要准确地知道哪个视图控制器需要首先显示 - 也就是你的默认视图控制器。
如果你不小心删除了该视图控制器或者使其不再是默认值,则会看到错误消息“Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?”,并且会出现一个纯黑色屏幕。
要解决问题,请打开你的Main.storyboard文件,找到你想要在应用程序第一次运行时显示的任何视图控制器。当它被选中时,转到属性检查器并勾选标记为“Is Initial View Controller”的框。你应该会看到一个右箭头出现在该视图控制器左侧,表示它是你故事板的入口点。

0

返回Storyboard并将此选项勾选,以使您的应用程序启动时进入所需的viewController

Checkmark this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接