Xcode:在两个目标之间共享主故事板

Posted

技术标签:

【中文标题】Xcode:在两个目标之间共享主故事板【英文标题】:Xcode: Share main storyboard between two targets 【发布时间】:2017-09-22 22:06:55 【问题描述】:

我不会在家里这样做,但我在工作。 (即“你不应该那样做”之类的回答不会被洗掉。)

目标:恢复到两个目标的共享主情节提要。 症状:插座似乎没有连接。 已经尝试过: 从设备中删除应用程序 进行干净的构建 探索故事板 XML(一切看起来都符合预期)

我继承了一个有两个目标的项目,每个目标都有自己的故事板。目标共享完全相同相同的代码。第二个目标的故事板是从第一个目标的故事板中复制而来的。它的差异很小:主要是不同的背景图像。 所有 出口到代码中的相同 ivar,就像第一个故事板中的相应出口一样。 (AFAIK)

现在,天真的第一步就是告诉第二个目标使用第一个目标的主故事板。这发生在目标 > 常规 > 部署信息中。 (或者在应用程序的 plist 文件中,用于黑客。)在 Copy Bundle Resources 构建阶段正在复制相应的故事板

但是,当应用程序运行时,在启动屏幕消失(即加载主视图)之前,我们会因 NSUnknownKeyException 而崩溃。对于似乎在两个故事板中正确连接的插座。 (当然是同一个 ivar。)

现在,期望这能立即奏效是太过分了。显然,我必须针对每个目标处理这些不同的背景图像。但我看不出有什么根本原因说明这个基本想法不可行。欢迎提出如何进行的建议。 (对星际迷航剧集“Spock's Brain”的引用只会是第一次有趣。)

【问题讨论】:

未知键是什么?只要两个目标中的类名相同并且所有@IBOutlets 都存在,它就应该可以工作。 未知键实际上是 ViewController 的一个 ivar 的名称,并且在两个故事板中正确连接到 IB 中的插座。因此,正如我们三个显然都认为的那样,它应该起作用。至少这给了我一些鼓励,我不是在尝试不可能的事情。将继续破解。 对于它的价值,关键是“activityIndi​​cator”,它是通过@IBOutlet 连接到 both 故事板中相应 UI 对象的实例变量的正确名称. (此插座按字母顺序排列,可能是运行时尝试连接的第一个插座。)我已删除并重新创建了连接,但无济于事。我已经覆盖了 setValue(_:forKey) 并设置了一个断点,无论如何都会发生崩溃,并且不会在断点处停止。当我恢复到旧的故事板(几乎在所有方面都相同)时,一切都很好了。谜团还在继续。 【参考方案1】:

我已经这样做了,它确实有效。如果您有一个重新设计的应用程序或一个应用程序有细微差别(例如应用内购买),而另一个版本包含应用程序价格的所有购买,这并不是一种不合理的方法。

听起来您的问题还有其他问题。您是否尝试过为应该具有该出口的类打破 initWithCoder 并验证您正在进入它?第二个目标不可能有一个具有相同名称但不同出口的不同类,并且用于构建或类似的东西?

另外,如果您在项目中有其他代码的故事板,您是否确保两者的文件定位正确,所以如果它们的名称相同,是否真的包含了正确的故事板?同样,对于两个项目中具有相同类名的任何文件。

我不断回到文件定位上...感觉某处可能存在某些问题,所以您认为实际使用的不是。

我刚刚在这里快速尝试了一个新项目,两个目标,从第二个中删除了除 info.plist 之外的所有内容,将第一个目标中的所有文件定位到第二个目标,它工作正常——插座按预期连接.

【讨论】:

谢谢 Clarus,周一会提供建议。 (周末不上班!) 短篇小说:故事板有不同的名称。当我从第二个应用程序的 Copy Bundle Resources 列表中删除第一个故事板时,我很早就因未找到文件而崩溃,所以我相信我使用的是正确的故事板文件。呜呜! 查看对 Paulw11 的回复。还尝试删除旧的故事板;没想到会有所不同,也没有看到任何差异。绝对不愿意在两个 Storyboard 上继续并行工作(主要是自动布局);同样不愿意用一个故事板和两个目标从头开始重新创建整个项目。 (这肯定会奏效。) P.S.:感谢您在发表意见之前实际尝试过。当然,上面的 Paulw11 没有阴影。但我们都经历过被误导的“建议”。

以上是关于Xcode:在两个目标之间共享主故事板的主要内容,如果未能解决你的问题,请参考以下文章

xcode:连接主故事板的问题

故事板中视图控制器之间的共享实例

在没有Segues的故事板之间传递变量 - Swift

故事板自定义类未实例化 UIView 类。为啥?目标 C / Xcode

在没有 Segues 的故事板之间传递变量 - Swift

在 XCode 4 中的多个故事板之间转换