繁体   English   中英

未能为 UIMainStoryboardFile 'Main' 实例化默认视图 controller - 也许未设置指定的入口点?

[英]Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?

我在新创建的应用程序中使用 Xcode,当我运行该项目时,它没有显示在 iOS 模拟器中,我收到以下消息:

未能为 UIMainStoryboardFile 'Main' 实例化默认视图 controller - 也许未设置指定的入口点?

当然,我用谷歌搜索了一下,每个人都指出这是因为 Xcode 还不知道哪个视图 controller 是初始视图。 但奇怪的是,我将应用程序创建为基于页面的应用程序(也尝试了单视图和选项卡式应用程序选项)应用程序和 Xcode 已经为它定义了一个 Storyboard。

此外,当我将 go 设置为项目的主界面选项时,设置了 storyboard(由 Xcode 本身命名为“Main”),并且在 Storyboard 中,我的视图 controller 被设置为“初始视图控制器”

是初始视图控制器

怎么了?

在属性检查器中检查是初始视图控制器

在此处输入图片说明

所以这也发生在我身上。 我检查了 50 次并且检查了我的“是初始视图控制器”,相信我。 它突然发生了。 那我是怎么修复的呢?

  1. 在您的项目中创建一个新的故事板,将其命名为 Main_iPhoneV2(或 iPadV2,具体取决于您的原始故事板样式)
  2. 打开坏掉的故事板,点击白色区域的任意位置并按command-a,然后command-c(全选并复制)
  3. 打开您的新故事板并按 command-v 粘贴相同的确切设置
  4. 转到您的项目设置,将您的“主界面”更改为新的 Main_iPhoneV2(如果是您的 iPad 并且您正在编写一个通用应用程序,则必须编辑 -Info.plist 并查找值“主故事板文件”基本名称 (iPad)
  5. 重新编译,不要再拔头发了

首先单击右侧实用工具栏中的视图控制器。 接下来选择Attributes Inspector并确保在 View Controller 部分下选中了“Is Initial View Controller”复选框!

如果您有以下代码,也会报告此警告:

    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.rootViewController = myAwesomeRootViewController
    window?.makeKeyAndVisible()

在这种情况下,转到目标设置的第一页并将Main Interface设置为空,因为您的应用程序不需要故事板条目。

我的 Tab Bar Controller 没有出现在模拟器中并出现黑屏时,我遇到过这种情况。 为了让我的应用程序出现在模拟器中,我执行了以下操作。

  1. 转到 Main.storyboard。
  2. 检查属性检查器选项卡下的Is Initial View Controller

是属性检查器中的初始视图控制器。

如果您不小心删除了该视图控制器,或者以其他方式将其设为默认值,那么您将看到错误“无法实例化 UIMainStoryboardFile 'Main' 的默认视图控制器 - 可能未设置指定的入口点?” 当您的应用程序启动时,伴随着纯黑的屏幕。

要解决这个问题,打开你的 Main.storyboard 文件,找到你想在你的应用程序第一次运行时显示的视图控制器。 选中后,转到属性检查器并选中标记为“是初始视图控制器”的框。 您应该会看到一个向右的箭头出现在该视图控制器的左侧,表明它是故事板的入口点。

使用界面生成器:

检查是否设置了“是初始视图控制器”。 您可以使用以下步骤进行设置:

  1. 选择您的视图控制器(将作为初始屏幕出现)。
  2. 实用程序窗口中选择属性检查器。
  3. 从“视图控制器”部分选择“是初始视图控制器”(如果不是)。

如果您已完成此步骤但仍出现错误uncheck and do it again.

解决问题的步骤

以编程方式使用:

目标-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

手动设置窗口,

- (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;
     }
}

当我将故事板文件名“ Main.storyboard ”更改为:“ XXX.storyboard ”时出现此错误

我的解决方案是:

  • 产品->清洁
  • 更改:支持文件-> info.plist ->主故事板文件基本名称->主要文件:XXX

祝你好运

以上都没有为我解决这个问题。 在我的情况下,它也没有设置正确的应用程序场景清单。

我不得不将 LoginScreen 更改为 Main

在此处输入图片说明

产品“清洁”是我的解决方案。

在此处输入图片说明

除了以上正确答案外,还要确保您在 General 中设置了正确的 Main Interface。

第一个选项

如果您想设置自定义故事板而不是默认视图控制器。

从 info.plist 文件更改此属性

<key>UISceneStoryboardFile</key> <string>Onboarding</string>

入职将是您的故事板名称

打开这个右键单击 info.plist 文件并作为源代码打开

第二个选项

1- 单击您的项目

2- 从目标部分选择您的项目

3- 移至部署界面部分

4- 从主界面字段更改您的故事板部分

请记住设置您的故事板初始视图控制器

如果您添加了新的故事板,那么您必须检查以下几点。

1) 在您的 plist 文件中,检查主故事板文件基本名称(iPad) 或 (iPhone) 的值应与您的故事板文件名匹配(不要添加扩展名.storyboard

2)在故事板中应该有一个视图控制器设置为初始视图控制器

3)清理并构建您的项目。 :)

在此处输入图片说明

如果您一直定期将代码提交到源代码管理,这可能会为您省去创建新故事板的麻烦,并可能会引入更多问题......

我能够通过比较与损坏版本工作的版本的 Git 源代码来解决这个问题。 差异显示第一行应该包含初始视图控制器的 Id,在我的例子中, initialViewController="Q7U-eo-vxw" 我搜索了源代码以确保该 ID 存在。 我所要做的就是把它放回去,一切又恢复了!

<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="Q7U-eo-vxw">
    <dependencies>
        <deployment defaultVersion="1296" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
    </dependencies>
    <scenes>

以下是一些可以帮助您排除故障的步骤:

  1. 右键单击失败的 Storyboard 并使用 Source Control > Commit... 保留自上次提交以来的更改。
  2. 尝试右键单击失败的 Storyboard 并使用“Open As > Source Code”来查看 Storyboard 的 XML。
  3. 文档元素中,查找名为“ initialViewController ”的属性。 如果丢失,请不要担心,我们会修复它。 如果它在那里,双击分配给它的 id,command-c 复制它,command-f command-v 在文档中更深入地搜索它。 这是应该提供初始视图的控制器的标识符。 如果它没有在文档中定义,那么这是一个问题——你应该从文档标签中删除它,在我的例子中initialViewController="Q7U-eo-vxw"
  4. 转到名为“视图”的 Xcode 菜单项,然后选择“版本编辑器”>“显示比较视图”
  5. 这会在左侧显示您的本地版本,在右侧显示历史版本。 单击历史版本下方的日期以获取此故事板的提交列表。 选择您知道有效的一个并比较文档元素。 *initialViewController的 id 是什么? 不一样吗? 如果是这样,请尝试手动编辑它并运行。 运行中的 xcode 历史比较工具

检查 AppDelegate 中是否有窗口变量。

var window: UIWindow? 

还要检查您的 Info.plist 文件的故事板。

<key>UIMainStoryboardFile</key>
<string>Main</string>

在 AppDelegate 中以编程方式设置 rootViewController 不会修复警告。 您应该选择是让故事板设置视图控制器还是以编程方式进行。

在 Xcode 11 及更高版本中创建的项目,仅从项目设置更改主界面文件是不够的。

您必须手动编辑 Info.plist 文件并为UISceneStoryboardFile设置故事板名称。

如果您不使用 storyboard

打开info.plist 在info.plist文件中删除如下特征 Information Property List -> Scene configuration -> Application Session Role -> Item 0 -> StoryBoard Name

如果你有场景委托,你必须检查 info.plist

<key>UIApplicationSceneManifest</key>
    <dict>
        <key>UIApplicationSupportsMultipleScenes</key>
        <false/>
        <key>UISceneConfigurations</key>
        <dict>
            <key>UIWindowSceneSessionRoleApplication</key>
            <array>
                <dict>
                    <key>UISceneConfigurationName</key>
                    <string>Default Configuration</string>
                    <key>UISceneDelegateClassName</key>
                    <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                    <key>UISceneStoryboardFile</key>
                    <string>Login</string>
                </dict>
            </array>
        </dict>
    </dict>

我在这里加载名为 Login.storyboard 的故事板

列表

如果您创建了一个名称不是“Main”的新故事板,则会出现一些问题,但很容易调整......

因此,在您创建了一个具有所需名称的新故事板并希望将其用作主要故事之后,请执行以下操作:

  1. 属性检查器中的复选框“是初始视图控制器”1
  2. 为您的目标选择所需的故事板作为“主界面”2
  3. 打开项目Info.plist并找到一个属性“故事板名称” ,您应该在其中键入所需的故事板名称作为值3

在 XCode 14.0.1 中对我有用的是,除了设置初始视图 controller 之外,还更新了构建设置:“UIKIT Main Storyboard File Base Name”为新名称 storyboard

对于未来的读者:- iOS 13、Swift 5

我从SceneDelegate以编程方式设置了初始视图 controller,我得到了这个作为警告并且视图 controller 设置完美。 所以我从Info.plist 中删除了 Storyboard Name并且警告永远消失了。

info.plist > Application Scene Manifest > Scene Configuration > Application Session Role > Storyboard Name > 删除这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM