Xcode 项目使用来自动态框架的主界面

Posted

技术标签:

【中文标题】Xcode 项目使用来自动态框架的主界面【英文标题】:Xcode project use main interface from dynamic framework 【发布时间】:2016-06-02 14:30:54 【问题描述】:

我创建了一个动态框架(需要是动态的,因为它包含 .swift 文件),该框架工作正常,我可以像这样从 appDelegate 以编程方式加载我的故事板:

    let frameworkBundle = NSBundle(identifier: "DynamicLibrary")
    let s = UIStoryboard(name: "MainStoryboardName", bundle: frameworkBundle)

    // Override point for customization after application launch.
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    // Override point for customization after application launch.
    self.window!.backgroundColor = UIColor.whiteColor()
    self.window!.makeKeyAndVisible()

    self.window!.rootViewController =  s.instantiateInitialViewController()

但是当我更改 ViewController(移动到同一个 .storyboard 内的另一个屏幕)时,应用程序崩溃了。 我想知道是否可以将动态框架中的 .storyboard 作为主界面包含在项目设置中。或者从动态框架加载 .storyboard 作为主故事板的最佳替代方法是什么。

【问题讨论】:

【参考方案1】:

提供比“应用程序崩溃”更具体的错误信息会很有帮助。

但一般来说,从包中加载 Interface Builder 文件的问题是由于文件中引用的类没有链接到输出中,因为链接器无法获取对包的引用。对此的规范补救措施是将-all_load -ObjC 添加到其他链接器标志。它有自己的一系列问题,但从某个地方开始。

【讨论】:

感谢您的回答,这次我可以避免添加这个邪恶的标志。 :)【参考方案2】:

我找到了我的问题的问题,只是在这里回答,因为它可能对其他人有用。

一开始我的故事板和资产都在我的项目中,因此我可以毫无问题地加载/链接它们。但是当我将它们移动到动态库(Cocoa 框架触摸)中时,我的应用程序开始崩溃,这是因为我加载资产的方式不再是在我的项目中而是在我的框架中。 所以当我在我的项目中拥有一切时,我正在这样做:

[UIImage imageNamed:@"bar_grey_2.png"]

但在将其移至我的框架后,我必须更新为:

[UIImage imageNamed:[[NSBundle bundleForClass:[self class]] pathForResource:@"bar_grey_1" ofType:@".png" inDirectory:nil]]

只是关于动态框架的评论,它们在ios7中不受支持,苹果将拒绝接受任何针对iOS7的动态框架的应用。

【讨论】:

问题标记为“swift”:请用 Swift 编写代码示例。谢谢。

以上是关于Xcode 项目使用来自动态框架的主界面的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11,使用 Main.storyboard 修复的主界面 [重复]

使用 swift 5 从远程读取 json 内容并在 Xcode 的主界面上打印

无法从 Xcode 项目中删除主界面

怎么将Eclipse中的主界面恢复原样?

测试用例

iOS中如何在欢迎界面中动态加载广告