iOS 7 - 无法实例化默认视图控制器

时间:2014-01-02 03:22:06

标签: ios iphone objective-c xcode xcode5

我在一个新创建的应用程序中使用Xcode 5,当我刚创建它时,我去运行按钮e点击它,然后项目构建但它没有显示在iOS模拟器中我收到以下消息:

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

我当然用Google搜索了它,并且每个人都指出这种情况正在发生,因为XCode还不知道哪个视图控制器是最初的控制器。但奇怪的是,我创建了一个基于页面的应用程序(也尝试过单视图和选项卡式应用程序选项)应用程序,XCode已经为它定义了一个故事板。

此外,当我转到项目的主界面选项时,设置了故事板(由Xcode本身命名为“Main”),在Storyboard中,我的视图控制器被设置为“初始视图控制器”

enter image description here

有什么问题?

17 个答案:

答案 0 :(得分:298)

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

enter image description here

答案 1 :(得分:52)

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

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

答案 2 :(得分:39)

首先单击右侧实用程序栏中的View Controller。接下来选择属性检查器,并确保在View Controller部分下选中'是初始视图控制器复选框!

答案 3 :(得分:14)

使用Interface Builder:

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

  1. 选择您的视图控制器(将作为初始屏幕显示)。
  2. Utilities 窗口中选择属性检查器
  3. 查看控制器部分选择“是初始视图控制器”(如果没有)。
  4. 如果您已完成此步骤但仍然出现错误uncheck and do it again.

    Steps to solve problem

    以编程方式使用:

    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;
    

    Swift:

            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
    

答案 4 :(得分:12)

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

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

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

答案 5 :(得分: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;
     }
}

答案 6 :(得分:8)

我遇到过这种情况,我的标签栏控制器没有出现在模拟器中,还有黑屏。为了让我的应用程序出现在模拟器中,我执行了以下操作。

  1. 转到Main.storyboard。
  2. 检查“属性”检查器选项卡下的Is Initial View Controller
  3. Is Initial View Controller in the Attributes Inspector.

答案 7 :(得分:5)

我更改故事板文件名时出现此错误&#34; Main.storyboard &#34; TO:&#34; XXX.storyboard &#34;

我的解决方案是:

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

祝你好运

答案 8 :(得分:3)

产品&#34;清洁&#34;对我来说是解决方案。

答案 9 :(得分:3)

enter image description here

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

答案 10 :(得分:2)

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

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

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

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

enter image description here

答案 11 :(得分:2)

以上均未为我解决问题。就我而言,这还没有设置正确的应用程序场景清单。

我不得不将LoginScreen更改为Main

enter image description here

答案 12 :(得分:1)

如果您定期将代码提交给源代码控制,这可以省去创建新故事板的麻烦,并可能引入更多问题......

我能够通过比较与破坏版本相对应的版本的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&gt;提交...以保留自上次提交以来的更改。
  2. 尝试右键单击失败的Storyboard并使用“Open As&gt; Source Code”查看故事板的XML。
  3. 文档元素中,查找名为“ initialViewController ”的属性。如果它丢失了,不要担心,我们会解决这个问题。如果它在那里,双击分配给它的id,command-c复制它,command-f command-v在文档的更深处搜索它。这是应提供初始视图的控制器的标识符。如果它没有在文档中定义那么这是一个问题 - 您应该从文档标记中删除它,在我的情况下 initialViewController =“Q7U-eo-vxw”
  4. 转到名为View的Xcode菜单项,然后选择Version Editor&gt;显示比较视图
  5. 这会在左侧显示您的本地版本,在右侧显示历史版本。单击历史版本下方的日期以获取此故事板的提交列表。选择一个您认识的工作并比较文档元素。 * initialViewController 的id是多少?有什么不同吗?如果是这样,请尝试手动编辑并运行。 xcode historical compare tool in action

答案 13 :(得分:1)

第一个选项

如果要设置自定义情节提要而不是默认的视图控制器。

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

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

入职将是您的故事板名称

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

第二个选项

1-单击您的项目

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

3-转到部署界面部分

4-在主界面字段

中更改情节提要部分
  

请记住设置您的情节提要初始视图控制器

答案 14 :(得分:0)

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

var window: UIWindow? 

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

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

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

答案 15 :(得分:0)

使用Xcode 11及更高版本创建的项目,仅通过项目设置更改主界面文件是不够的。

您必须手动编辑Info.plist文件并为UISceneStoryboardFile设置情节提要名称。

答案 16 :(得分:0)

如果你有场景委托,你必须检查 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