在UIMainStoryboardFile 'Main'中无法实例化默认的视图控制器 - 可能未设置指定的入口点?

103
我在新创建的应用程序中使用Xcode,但当我运行该项目时,它不会显示在iOS模拟器中,并且会出现以下消息:“无法实例化UIMainStoryboardFile 'Main' 的默认视图控制器 - 可能未设置指定的入口点?”当然我已经Google过了,每个人都指出这是因为Xcode还不知道哪个视图控制器是初始视图控制器。但奇怪的是,我将应用程序创建为基于页面(也尝试了单页面和选项卡应用程序),而 Xcode已经为其定义了一个Storyboard。另外,当我转到项目的主要界面选项时,故事板(由Xcode自己命名为“Main”)已设置,在Storyboard中,我的视图控制器被设置为“Initial View Controller”。出了什么问题?

尝试以编程方式设置它... - Shamsudheen TK
@Ramshad 你好,我在iOS开发方面还是个新手。你能告诉我怎么做吗? - rodrigoalvesvieira
https://dev59.com/8Wkv5IYBdhLWcg3wsCpO - Hemang
3
请确保将视图控制器设置为初始视图控制器。 - Sandeep
正如Kashif Ahmed所指出的那样,您还需要将Info.plist文件打开为源代码,并编辑<key>UISceneStoryboardFile</key>字符串,在其中提供您新故事板的名称。 - bogdan
22个回答

315

在属性检查器中检查是否为初始视图控制器(Is Initial View Controller)

图片描述


当然,这是“应该的工作方式”。但我也遇到过“错误”,然后它就不起作用了。在我的情况下,创建一个新的并复制所有内容确实有效! - Tys
但他的视图控制器已经设置为初始视图控制器了,不是吗? - Yuriy Vasylenko
@YuraVasylenko:以前不是这样的,所以我已经标记为选中。 - Ashvin
1
只是为了让那些需要的人更详细地了解,设置Storyboard的初始控制器 - Sergei Basharov

57

我也遇到了这个问题。我检查了50遍,“是否为初始视图控制器”已经被勾选了,相信我。它突然就出现了。那么我该如何解决呢?

  1. 在项目中创建一个新的Storyboard,命名为Main_iPhoneV2(或iPadV2,取决于你原来的Storyboard风格)。
  2. 打开损坏的故事板,在白色区域点击任意位置,按下Command-A,然后按下Command-C(全选并复制)。
  3. 打开你的新故事板,按下Command-V以粘贴完全相同的设置。
  4. 进入你的项目设置,将“Main Interface”更改为新的Main_iPhoneV2(如果是iPad且你正在编写通用应用程序,你需要编辑-Info.plist并查找值“Main storyboard file base name (iPad)”)。
  5. 重新编译,不要抓狂了。

3
在尝试开发者基础教程中列出的步骤时,遇到了相同的问题。创建了一个新的Storyboard,并将其标记为初始视图控制器,并通过项目部署信息将其设置为主Storyboard,它就神奇地开始工作了。不确定是否是Xcode的某些错误。https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOS/FirstTutorial.html#//apple_ref/doc/uid/TP40011343-CH3-SW1 - ioWint
除非将初始导航控制器设置为“是初始视图控制器”,否则此方法无法正常工作或我认为不会正常工作。 - Sumit Kumar Saha
我本来想尝试这个。但是后来我清理并重新构建了一遍,然后它就成功了。 - Skywalker

41

首先,在右侧的实用工具栏中点击查看控制器。接下来选择属性检查器,确保在查看控制器部分下选中'是初始视图控制器'复选框!


1
这是我的问题。我删除了故事板中的默认视图控制器,当我添加另一个时必须检查这个。 - Orgmir

22

如果您有如下代码:

这也会报告此警告:

window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.rootViewController = myAwesomeRootViewController
window?.makeKeyAndVisible()
在这种情况下,请转到目标 > 通用 > 部署信息,并将主界面设置为空,因为您的应用程序不需要故事板入口:

empty Main Interface


16

我曾经遇到过Tab Bar Controller在模拟器中不显示并出现黑屏的问题。为了让我的应用程序在模拟器中正常显示,我按照以下步骤操作:

  1. 进入Main.storyboard。
  2. 检查属性检查器选项卡下的“Is Initial View Controller”复选框。

Is Initial View Controller in the Attributes Inspector.

如果您意外删除了该视图控制器,或者使其不是默认视图控制器,则在应用启动时会出现错误“无法实例化UIMainStoryboardFile'Main'的默认视图控制器-可能未设置指定的入口点?”,以及一个纯黑屏幕。
要解决此问题,请打开Main.storyboard文件,找到您希望在应用程序首次运行时显示的任何视图控制器。当选择它时,转到属性检查器并选中标记为“Is Initial View Controller”的框。您应该会看到一个向右的箭头出现在该视图控制器的左侧,显示它是您故事板的入口点。

14

使用Interface Builder:

检查是否已设置“Is initial view controller”。您可以按以下步骤进行设置:

  1. 选择您的视图控制器(将出现为初始屏幕的控制器)。
  2. 实用工具窗口中选择属性检查器
  3. View Controller部分中选择“Is Initial View Controller”(如果没有)。

如果您已经执行了此步骤,但仍然出现错误,则取消选中并重新执行。

解决问题的步骤

使用编程方式:

Objective-C:

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>

        self.window.rootViewController = viewController;
        [self.window makeKeyAndVisible];

        return YES;

快捷 :

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true

3
如果您选择通过编程方式实现,务必从目标的“主界面”中删除故事板 - 只需将其留空即可。此外,这应该放在didFinishLaunchingWithOptions方法中。 - Jordan H
@JordanH 怎样将故事板从目标主界面中移除? - PascalS
@Passe 选择文本并按删除键,它在常规选项卡中。 - Jordan H

10

手动设置窗口大小。

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (!application.keyWindow.rootViewController) 
     {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *myViewController= [storyboard instantiateViewControllerWithIdentifier:@"myViewController identifier"];

         application.keyWindow.rootViewController = myViewController;
     }
}

这需要在Storyboard中取消选中初始的ViewController吗? - bdv

9

以上方法都未能解决我的问题。在我这种情况下,还需要设置正确的应用场景清单。

我必须将使用的LoginScreen更改为Main。

输入图像描述


1
很惊讶这个问题没有得到更多的投票。这几乎会发生在任何未使用Storyboard作为初始控制器的SceneDelegate实现中。 - bauerMusic

7

当我将故事板文件名从 "Main.storyboard" 改为 "XXX.storyboard" 时,出现了以下错误:

对我来说,解决方案是:

  • 选择 "Product" -> "Clean"
  • 更改:Supporting Files -> info.plist -> Main storyboard file base name -> Main 为 XXX

祝好运!


4

"Clean"产品对我来说是个不错的解决方案。


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