【问题标题】:Using a storyboard reference to a storyboard in a different project/bundle appears broken使用情节提要对不同项目/捆绑包中情节提要的引用似乎已损坏
【发布时间】:2016-04-22 01:42:36
【问题描述】:

现在,我有一个工作区,里面有两个项目,一个叫“ProjectOne”,另一个叫“ProjectTwo”,如下所示:

他们分别有一个故事板,现在我想通过按“到项目二”来连接两个故事板,如下所示:

但是当我点击按钮时,它会显示

“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,>原因:'在捆绑包NSBundle 8C6A5FDC9E06/ProjectOne.app>(已加载)中找不到名为'two'的故事板'”

有可能做到吗?找了几天方法还是不知道...

【问题讨论】:

  • 我的一位同事今天遇到了同样的问题。似乎故事板中的 Bundle 标识符被忽略了。这可以通过为 ProjectTwo 创建一个NSBundle 实例并记录其描述来验证。然后,描述将清楚地指示 ProjectTwo 而不是 ProjectOne。你找到解决办法了吗?

标签: ios xcode uistoryboard


【解决方案1】:

如果您的故事板在另一个项目/模块中,您需要使用您包含的故事板的完整名称 - 这意味着包括捆绑名称。请参阅下图,了解如何在情节提要中进行设置。我已经使用 ProjectOne 和 ProjectTwo 创建了一个示例设置,与您的项目设置相同。

关键是您在 Storyboard 参考中输入的信息。您还需要包含捆绑名称!仅供参考,我提供了指向Adding a Storyboard Reference的链接

编辑

虽然这可行,但当您开始使用由视图控制器支持的各种场景构建故事板时,它会导致稍后出现问题,这些场景现在必须链接到两个项目目标。更重要的是,这种关系隐藏在项目的配置细节中。更好的方法是利用工作区并为两个项目使用的资源添加一个共享文件夹。

接下来将共享文件夹添加到与 ProjectOne 和 ProjectTwo 处于同一级别的工作区。现在,通过将共享文件夹的引用拖到项目文件 (xcodeproj) 上,为每个项目添加对共享文件夹的引用。这将为您将文件夹添加到项目目标中。

现在每个项目都包含对共享文件夹的引用,共享关系现在明确显示在项目导航器中。

【讨论】:

  • OP中的截图清​​楚地显示输入了bundle名称。
  • 我正在确认设置 - 我编译了项目并运行了
  • 我将查看我的示例项目设置并在需要时编辑答案
  • 好点。 OP 没有提供足够的信息来判断捆绑名称是否输入错误。我只是假设它输入正确。
  • @fragilecat 有什么方法可以找出“真正的捆绑包”吗?
【解决方案2】:

1.您可以像这样添加两个故事板的目标成员:

2.更改Project two中的源文件名,避免冲突, 检查他们的目标成员到Project one,将这些更改配置到故事板二。

3.Project twoAppDelegate文件保持不变。

【讨论】:

  • 感谢您的帮助,有什么方法可以添加目标成员吗?因为我在工作区中添加了两个项目,但在两个故事板中只显示了一个目标成员。
  • 我可以确认@IvanNgan 的观察。
  • @IvanNgan 我直接将第二个项目添加为子项目,抱歉我的错误。
  • @ErikBrandsma 这很有帮助,我现在有了一些想法。但我也遇到了一些问题,有什么方法可以找出“真正的捆绑包”吗?
【解决方案3】:

如果您在 Storyboard 中引用的 Bundle 在调用 Segue 之前从未加载,系统将使用主应用程序包。苹果方面的错误或忽视?

要解决问题,您必须加载包。

let bundle = ... {your bundle here} 
if !bundle.isLoaded() {
    bundle.load()
}

在应用启动时执行它,或者在尝试执行 segue 之前确保它运行。

多年来,我多次遇到此问题,但无法弄清楚是什么原因造成的。 曾经在不同地方从同一个 ViewController 调用的 segue 曾经工作过,而其他地方则没有。我快疯了! 然后我发现,工作调用之前是从代码中手动加载这个故事板中的一些自定义弹出控制器。它导致了 Bundle 的负载,并在会话期间“神奇地”解决了问题。

【讨论】:

    【解决方案4】:

    这是我找到的从项目中引用 pod 的解决方案 - 您可以从 pod(或您的情况下的其他项目)公开捆绑包,然后在需要时访问它。值得一提的是,您要访问的方法应该是公开的。

        static var bundle:NSBundle {
        let podBundle = NSBundle(forClass: thisViewController.self)
    
        let bundleURL = podBundle.URLForResource("myPod", withExtension: "bundle")
        return NSBundle(URL: bundleURL!)!
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2013-10-14
      • 2014-11-02
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多