我有一个包含多个目标和多个配置的项目:让我们说Target1/Target2
和Debug/Alpha/Release
配置。我还有一个带有一些自定义类的故事板:让我们说自定义类ViewController
这是我的故事板中的初始VC。我想在代码中从故事板加载视图控制器,如下所示:
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! ViewController
ViewController是两个目标的成员。当我在Target1
上运行上面的代码时 - 两种配置都可以。当我在Target2
上运行它时Debug
就可以了,但在Alpha
上失败并显示以下消息:
Interface Builder文件中的未知类ViewController。无法将'UIViewController'(0x10fbc71d0)类型的值转换为'Target2.ViewController'(0x10b29cb88)。
(如果故事板XML中没有customModule
)
或
Interface Builder文件中的未知类_TtC6Target19ViewController。无法将'UIViewController'类型的值(0x1083161d0)转换为'Target2.ViewController'(0x103e6b840)。
(如果故事板XML中的customModule
与当前目标不匹配)
最终导致应用崩溃。
似乎在从故事板加载时无法为类名添加适当的命名空间。
Identity inspector looks like this: 在故事板XML中有:
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
如果我在故事板检查器中指定模块,或者直接在此视图控制器的XML中指定模块(customModule =“Target2”),那么一切都适用于Target2
上的两个配置,但显然在{{1}上失败}。
在两个目标的构建设置中:Interface Builder Storyboard编译器 - 选项 - &gt;默认模块继承自Target1
,继承自$(PRODUCT_MODULE_NAME)
,最终继承$(PRODUCT_NAME:c99extidentifier)
。如果我在运行时打开TARGET_NAME $(TARGET_NAME)
(这不起作用),我会看到正确的目标名称(在这种情况下为Target2 + Alpha
)。这意味着模块名称应该在加载时适当地添加到ViewController作为名称空间。
当我使用所描述的配置集创建示例项目时,一切正常,这意味着我的Target2
- 实际项目中的配置出错了,但它几乎是Alpha
的精确副本(不包括所有路径),这是有效的。
经过两天的探索和更改所有这些设置后,我没有想法,所以如果有人有,请填写免费分享。我会更感激。