在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个回答

4
如果您添加了新的故事板,则需要检查以下几点:
  1. 在plist文件中,检查Main storyboard file base name(iPad)或者(iPhone)的值是否与你的故事板文件名匹配(不要加后缀.storyboard)

  2. 在故事板中,应该有一个视图控制器被设置为Is initial view controller

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

enter image description here


3

第一种选择

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

从info.plist文件中更改此属性

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

Onboarding 将是你的故事板名称

要打开此文件,请右键单击info.plist文件并选择“以源代码方式打开”

第二种选择

1- 点击你的项目

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

3- 移动到部署界面部分

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

请记得设置你的故事板初始视图控制器


1
这个<key>UISceneStoryboardFile</key>的东西解决了我的问题。谢谢。 - bogdan

3

enter image description here

除了上述正确答案之外,还要确保您在“常规”中设置了正确的主界面。

3

Xcode 11及以上版本创建的项目,仅仅从项目设置中更改主接口文件是不够的。

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


2
如果您经常将代码提交到源代码控制中,这可能会使您免去创建新的Storyboard并可能引入更多问题的麻烦...
我通过比较可以工作的版本和有问题的版本的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,使用“源代码管理>提交...”来保存自上次提交以来所做的更改。 2. 尝试右键单击失败的Storyboard,使用“打开方式>源代码”查看Storyboard的XML代码。 3. 在document元素中,查找名为“initialViewController”的属性。如果缺少该属性,请不要担心,我们将修复它。如果存在该属性,请双击分配给它的id,使用command-c进行复制,然后使用command-f command-v在文档中深入搜索它。这是应提供初始视图的控制器的标识符。如果文档中未定义它,则存在问题 - 您应该从文档标签中删除它,在我的情况下initialViewController="Q7U-eo-vxw"。 4. 转到Xcode菜单项“查看”,选择版本编辑器>显示比较视图。 5. 这将在左侧显示本地版本,在右侧显示历史版本。单击历史版本下方的日期以获取此Storyboard的提交列表。选择一个您知道有效的提交,并比较document元素。 *initialViewController的id是什么?是否不同?如果是,请尝试手动编辑并运行。 xcode historical compare tool in action

1

检查您在AppDelegate中是否有window变量。

var window: UIWindow? 

同时检查一下您的 Info.plist 文件的故事板。

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

在AppDelegate中以编程方式设置rootViewController并不能解决警告问题。您应该选择让storyboard设置视图控制器或通过编程来实现。

1
如果您有场景代理,您需要在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的故事板。 plist

1
如果您创建了一个名称不是“Main”的新Storyboard,可能会遇到一些问题,但很容易进行调整...
因此,在创建了所需名称的新Storyboard并将其用作主要故事后,请执行以下操作:
1. 在Attributes Inspector中选中“Is Initial View Controller”复选框: 1 2. 选择所需的Storyboard作为您的目标的“Main Interface”: 2 3. 打开项目Info.plist并找到属性“Storyboard Name”,在其中输入所需的Storyboard名称作为值。 3

1
如果您没有使用故事板
打开info.plist文件 在info.plist文件中删除以下功能 信息属性列表->场景配置->应用程序会话角色->项目0->StoryBoard名称

0

请检查info.plist,因为那里设置了默认的故事板名称,如果它与您想要运行的故事板名称相似。


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