【问题标题】:Could not find a storyboard named 'MainStoryBoard' in bundle NSBundle在捆绑包 NSBundle 中找不到名为“MainStoryBoard”的故事板
【发布时间】:2012-01-31 10:59:52
【问题描述】:

几天前我已经启动了一个新应用程序,并开始使用模拟器对其进行测试。我从一个空项目开始并手动添加了故事板。模拟器可以很好地构建和运行我的应用程序,但是当我尝试构建到我的 iPhone 时,我收到消息“在 bundle NSBundle 中找不到名为“MainStoryBoard”的故事板

Google 什么也没找到,this question 建议我检查故事板的目标,但一切就绪。即便如此,如果某些东西不到位,模拟器也不会运行。

谁能指出我正确的方向?

【问题讨论】:

  • 检查您的构建阶段以查看您的情节提要是否是 copybundleresource

标签: iphone ios xcode-storyboard


【解决方案1】:

更新:Swift 5 和 iOS 13:

  1. 创建单一视图应用程序。
  2. 删除 Main.storyboard(右键单击并删除)。
  3. Info.plist 文件中的默认场景配置中删除故事板名称
  4. 打开SceneDelegate.swift并将func scene从:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let _ = (scene as? UIWindowScene) else { return }
}

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).x

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = ViewController()
        self.window = window
        window.makeKeyAndVisible()
    }
}

现在你可以走了:)

【讨论】:

    【解决方案2】:

    有两种可能,

    1. 确保您的 Storyboard 已添加到您的目标中。

    Select Storyboard > Go to file inspector (first right tab) > Check Target Membership

    1. 用正确的bundle初始化故事板。

      • 如果情节提要与您正在处理的目标相同,则使用bundle = nil
      • 如果情节提要与您正在处理的目标不同,请尝试以下代码来初始化捆绑包和情节提要。

        let bundle = Bundle(for: MyClass.self)
        let storyboard = UIStoryboard(name: "Main", bundle: bundle)
        

    【讨论】:

      【解决方案3】:

      在我的例子中,它是一个 Mac 应用程序框架内的故事板。我正在使用:

      let storyboard = NSStoryboard(name: "StoryboardName", bundle: nil)
      

      并且需要使用框架的包标识符来获取正确的包:

      let storyboard = NSStoryboard(name: "StoryboardName",
                                  bundle: Bundle(identifier: "com.company.FrameworkName"))
      

      【讨论】:

        【解决方案4】:

        我也有同样的问题,导致这种异常的原因是我写了“Main.storyboard”而不是“Main”。我们不必指定 .storyboard 扩展名。

        【讨论】:

          【解决方案5】:

          尝试了上面提到的所有解决方案,但没有奏效。

          经过深入研究找到了罪魁祸首:

          TARGETS 中缺少复制捆绑资源 -> 构建阶段

          这在移除 Cocoapods 时被意外移除了。

          以下是解决此问题的步骤:

          1. 转到您项目的TARGETS
          2. 点击左上角的plus (+) button
          3. 从下拉列表中选择新的复制捆绑资源
          4. 现在,添加您Storyboard files (Main, Launchscreen etc). 并添加资产文件夹。 您可以通过点击底部的加号 (+) 按钮来添加这些文件

          1. 删除derived data content
          2. Delete the app 来自模拟器/设备并再次运行

          【讨论】:

            【解决方案6】:

            如果你使用源代码导航,请尝试使用下面的代码

            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
            

            通常人们会输入“Main.storyboard”作为名称,因为这实际上是文件的名称,但对于 Obj-C 编码的目的,“X.storyboard”的名称是“X”,所以在本例,@"Main"。

            【讨论】:

            • 这是我的情况,我首先尝试将名称命名为“Main.storyboard”,因为这是我在选择故事板后在文件检查器 > Nama 中看到的。但似乎我们必须使用在 Info.plist > Main storyboard file base name 中找到的名称,即“Main”。所以对我来说,这很有效:let myStoryboard = UIStoryboard(name: "Main", bundle: nil)
            【解决方案7】:

            Nitin Alabur 的回答帮助了我,但只是间接的。发布另一个答案以澄清:

            我正在构建一个内部带有情节提要的动态框架,并且在我为测试框架而构建的测试应用程序中,我收到了这个错误。

            我的代码如下所示:

            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
            

            我忽略了NSBundle 的东西,因为,嘿,我不知道捆绑包到底是什么。事实证明,这对于这个用例很重要,故事板将存在于应用程序的“包”之外(而是在我的框架的包中)。此代码将告诉 iOS 在当前类所在的包中查找情节提要(对我来说,它是包含我的框架的包):

            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:[NSBundle bundleForClass:[self class]]];
            

            【讨论】:

              【解决方案8】:

              这对我(Swift 2.1,Xcode 7.2)有一个标签栏的应用程序有帮助

                  let storyboard: UIStoryboard = UIStoryboard(name:"Main",bundle: NSBundle(forClass: self.dynamicType))
                  let tabController = storyboard.instantiateViewControllerWithIdentifier("MyTabBarIdentifier") as! UITabBarController
              

              我的 Main.storyboard 具有正确的目标成员资格、复制捆绑资源、清理构建文件夹等(大多数答案都指向这个)。

              【讨论】:

              • 这对我有帮助 - 我发布了 another answer 来展示它是如何帮助的。谢谢!
              【解决方案9】:

              您只需检查Supporting files文件夹下的配置文件(.plist

              检查默认故事板的名称。

              【讨论】:

                【解决方案10】:

                转到您的 info.plist on Build Phases > Copy Bundle Resources 并使用图标“+”添加您的故事板

                【讨论】:

                  【解决方案11】:

                  我的解决方案是,我只需要将 MainStoryboard 添加到 Bundle Resources。之后,它就可以正常工作了。

                  项目 -> 构建阶段 -> 复制捆绑资源 -> 点击 + 按钮并添加您的文件。

                  【讨论】:

                    【解决方案12】:

                    我认为您可能已删除情节提要并决定在初始应用启动时使用 .xib 文件。在这种情况下,Xcode 会尝试查找不存在的故事板。

                    对于这种情况,单击项目 > Info > Custom iOS Target Properties 并删除此键值对: Main storyboard file base name

                    【讨论】:

                    • 实际上,UIStoryboard storyboardWithName 方法的值就是 Main。总之:[UIStoryboard storyboardWithName:@"Main" bundle:nil]
                    【解决方案13】:

                    一个简单的清理为我纠正了错误。

                    【讨论】:

                    • :) 太棒了。我也更正了。
                    • 也为我工作
                    【解决方案14】:

                    非常愚蠢,但我的 .plist 的 “主故事板文件基本名称 (iPad)” 条目中有“MainStoryboard.storyboard”,而不仅仅是“MainStoryboard”。

                    【讨论】:

                      【解决方案15】:

                      我在一个项目中遇到了这个问题,该项目的情节提要带有和不带有 ~iPad 或 ~iPhone 后缀,例如 MainStoryboard.storyboard 和 MainStoryboard~iPad.storyboard。

                      问题是 MainStoryboard.storyboard 在编译到构建目录时覆盖了 MainStoryboard~iPad.storyboard。如果文件以相反的顺序编译,则两者都将被保留而不会出现问题。我不知道为什么会这样。

                      要解决此问题,您可以停止使用 ~iPad/iPhone 后缀,或确保文件在 Copy Bundle Resources 阶段中的顺序正确。

                      (使用 XCode6.2beta2)

                      【讨论】:

                        【解决方案16】:

                        当我在模拟器上安装了以前的同名应用时,我发生了这种情况。

                        我已经删除了之前的应用程序,在“部署信息”中重新选择了 Storyboard,重新运行应用程序,一切正常。

                        【讨论】:

                          【解决方案17】:

                          只想提一下我遇到的场景。我不知道怎么做,但情节提要与目标断开连接,尽管它仍然是项目的一部分。为了解决这个问题,我打开了故事板,选择了“文件检查器”(右侧面板上最左边的图标)并检查了“目标成员资格”下的项目。 希望它可以帮助某人。

                          【讨论】:

                          • 令我惊讶的是,事情是如何从根本上不受控制的!谢谢!这解决了我的问题!
                          【解决方案18】:

                          当您取消选择“使用基础国际化”并在不同的语言环境而不是您的特定本地化环境中运行模拟器时会出现问题。

                          例如,你在项目设置中指定了zh-CN本地化,但在en-US下运行模拟器。

                          【讨论】:

                          • 我认为 Xcode 11 将其称为“本地化原生开发区域”,但对其进行更改使其工作。
                          【解决方案19】:

                          当我在代码中调用情节提要时发生了这个问题。原因是我为情节提要使用了不同的“单词”。我这样解决了

                          转到 Targets ->info ,选择 info,复制故事板的名称并将其粘贴到您调用故事板的位置。

                          至少试一试……

                          【讨论】:

                            【解决方案20】:

                            当我不小心打开了第二次安装 Xcode 的项目时,我遇到了这个问题。它永久破坏了我的项目文件(这是可以理解的)。

                            【讨论】:

                              【解决方案21】:

                              为了防止这种情况发生,我不得不改变处理故事板文件的方式。编辑故事板后保存文件,然后退出 XCode。这似乎可以防止问题发生。

                              【讨论】:

                                【解决方案22】:

                                当我向UIAppFonts 添加大约 150 种字体时,我在设备上遇到了这个错误。
                                在我将它们的数量减少到大约 100 后,它就消失了。

                                【讨论】:

                                  【解决方案23】:

                                  如果您最近将 iOS sim 重置为默认设置,检查其首选项中的区域设置也很有用。我正在使用俄语作为唯一语言环境的应用程序,在 sim 重置后,xCode 停止启动应用程序,因为 sim 语言环境设置为英语。

                                  【讨论】:

                                    【解决方案24】:

                                    转到您的项目,选择您的目标并从菜单中下拉以重新选择您的故事板。

                                    另外,你可以更新你的plist,我发现改变一个并没有改变另一个。

                                    【讨论】:

                                      【解决方案25】:

                                      我有类似的问题,我收到以下错误。

                                      异常“NSInvalidArgumentException”,原因:“在捆绑包 NSBundle 中找不到名为“MainStoryboard_iPhone”的情节提要

                                      我通过更新 plist 文件修复了它。只需转到编辑->查找->在工作区中查找并搜索“故事”。现在更新故事板的适当名称。

                                      【讨论】:

                                        【解决方案26】:

                                        我的应用程序在 iPhone 模拟器上正常运行,但奇怪的是 Xcode 停止响应,我不得不强制退出 Xcode。当我重新启动 Xcode 时,我遇到“找不到名为 MainStoryboard .... 的故事板”,

                                        我已经通过以下步骤解决了这个问题:

                                        1. 将“MainStoryboard.storyboard”重命名为“MainStoryboard_1.storyboard”
                                        2. 打开位于“Supporting Files”文件夹中的文件“$your_app$-Info.plist”。将“主故事板文件基本名称”编辑为“MainStoryboard_1.storyboard”。
                                        3. 重新运行应用程序,它对我有用。
                                        4. 我将故事板文件重命名为原来的“MainStoryboard.storyboard”。
                                        5. 将 .plist 文件编辑回其原始文件。
                                        6. 重新运行应用程序,它对我有用。

                                        由于某种原因,强制退出 Xcode 后无法识别文件“MainStoryboard.storyboard”,然后按照上述步骤使应用重新识别该文件。

                                        希望这个解决方案有所帮助..

                                        【讨论】:

                                        • 这对我有用,谢谢你让我的头发不脱落。
                                        • 我更改了 .plist 文件,保存并改回来,这对我没有任何影响。然后我重命名了 .storyboard 文件并将其重命名回来,从那时起它就可以工作了。
                                        • 也为我工作,谢谢!仅供参考,我从未关闭过 XCode,但按照步骤操作,它确实有效(因此您无需打开和关闭 XCode)
                                        • 我也发现删除派生数据也很有帮助。
                                        • 这种答案让 StackOverflow 值得我们为它付出的每一分钱。神秘 Xcode BS 的最佳答案。
                                        【解决方案27】:

                                        模拟器不区分大小写,但设备是。如果您的故事板被称为 MainStoryboard,而不是 MainStoryBoard,这将导致您的问题。

                                        【讨论】:

                                        • 上述解决方案是 100% 正确的。但是,如果您为您的应用程序使用多个故事板,那么最好在 .plist 中将故事板名称留空.....希望对您有所帮助。
                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2015-04-29
                                        • 1970-01-01
                                        • 2012-09-20
                                        • 1970-01-01
                                        • 2021-02-09
                                        • 1970-01-01
                                        • 2014-11-02
                                        相关资源
                                        最近更新 更多