无法在捆绑NSBundle中找到名为“MainStoryBoard”的故事板

时间:2012-01-01 18:35:59

标签: iphone ios xcode-storyboard

我几天前开始使用新的应用程序,并开始使用模拟器进行测试。我开始是一个空项目并手动添加故事板。模拟器构建并运行我的应用程序就好了但是当我尝试构建到我的iPhone时,我得到了消息“无法在捆绑NSBundle中找到名为'MainStoryBoard'的故事板'。

Google没有发现任何内容,this question建议我检查我的目标是否有故事板,但一切都已到位。即便如此,如果某些东西不存在,模拟器也不会运行。

有人能指出我正确的方向吗?

27 个答案:

答案 0 :(得分:75)

我让我的应用程序在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. 重新运行应用程序,它对我有用。
  7. 由于某种原因,强制退出Xcode后无法识别文件“MainStoryboard.storyboard”,并且按照上述步骤使应用程序再次识别该文件。

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

答案 1 :(得分:35)

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

答案 2 :(得分:23)

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

答案 3 :(得分:9)

当您取消选择"使用Base Internationalization"并在不同的语言环境中运行模拟器而不是您的特定本地化。

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

答案 4 :(得分:6)

尝试了上述所有解决方案,但没有奏效。

经过深入研究后发现了罪魁祸首:

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

在移除Cocoapods时意外删除了。

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

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

    screenshot

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

答案 5 :(得分:4)

这对于带有标签栏的应用程序

有帮助(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具有正确的目标成员资格,复制捆绑资源,清理了构建文件夹等(大多数答案都指向了这一点)。

答案 6 :(得分:4)

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

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

答案 7 :(得分:3)

Nitin Alabur的答案对我有所帮助,但间接帮助了我。发布另一个答案澄清:

我正在构建一个带有故事板的动态框架,在我构建的测试应用程序中测试框架,我收到了这个错误。

我的代码看起来像这样:

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

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

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

答案 8 :(得分:3)

如果您在源代码上使用导航,请尝试使用以下代码

if(num%2==1) 
    int odd=1; 
    for(int i=0; i<num; i++){
        String a=""; 
        for(int j=1; j<=odd; j++)
            { a=odd+" "; 
              odd+=2; 
System.out.print(a); }
       System.out.println(); }

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

答案 9 :(得分:3)

简单的清洁为我纠正了错误。

答案 10 :(得分:2)

更新:Swift 5和iOS 13:

  1. 创建单视图应用程序。
  2. 删除 Main.storyboard (右键单击并删除)。
  3. Info.plist文件中的默认场景配置中删除故事板名称enter image description here
  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()
    }
}

现在您可以去:)

答案 11 :(得分:2)

我也有同样的问题,造成这种类型异常的原因是我写过&#34; Main.storyboard&#34;而不是&#34; Main&#34;。我们不必指定.storyboard扩展名。

答案 12 :(得分:2)

您只需要检查.plist文件夹

下的配置文件(Supporting files

检查默认情节提要的名称。

答案 13 :(得分:2)

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

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

答案 14 :(得分:1)

当我在模拟器上安装了一个同名的应用程序时,就发生了这种情况。

我删除了之前的应用,重新选择了“部署信息”中的故事板,重新运行应用,一切正常。

答案 15 :(得分:1)

当我在代码中调用故事板时,这个问题发生在我身上。原因是我在故事板上使用了不同的“单词”。我解决了这个问题

转到目标 - &gt;信息,选择信息,复制故事板的名称并将其粘贴到您调用故事板的位置。

至少试试......

答案 16 :(得分:1)

我在第二次安装Xcode时意外打开了一个项目时遇到了这个问题。它永久地破坏了我的项目文件(这是可以理解的)。

答案 17 :(得分:1)

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

答案 18 :(得分:0)

我在一个有或没有~iPad或~iPhone后缀的故事板的项目中遇到过这个问题,比如MainStoryboard.storyboard和MainStoryboard~iPad.storyboard。

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

为了解决这个问题,你可以停止使用~iPad / iPhone后缀,或者确保文件在Copy Bundle Resources阶段的顺序正确。

(使用XCode6.2beta2)

答案 19 :(得分:0)

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

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

转到构建阶段&gt;上的info.plist复制捆绑资源并使用图标&#34; +&#34;

添加故事板

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

就我而言,它是Mac应用程序框架内的故事板。我正在使用:

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

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

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

答案 25 :(得分:0)

有两种可能性,

  1. 确保将故事板添加到目标中。
  2. Select Storyboard > Go to file inspector (first right tab) > Check Target Membership

    enter image description here

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

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

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

答案 26 :(得分:0)

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

exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'MainStoryboard_iPhone' in bundle NSBundle

我通过更新plist文件来修复它。只需转到Edit-&gt; Find-&gt;在工作区中查找并搜索“故事”。现在更新故事板的相应名称。