从框架加载 nib 文件时出现 NSInternalInconsistencyException
Posted
技术标签:
【中文标题】从框架加载 nib 文件时出现 NSInternalInconsistencyException【英文标题】:NSInternalInconsistencyException when loading nib file from framework 【发布时间】:2020-03-06 09:19:55 【问题描述】:我在 Xcode 11 上快速创建了一个名为 TestFramework 的 ios 框架,并在目标构建设置中将其 Mach-O Type
设置为 static library
。
我在框架项目中添加了一个名为MyViewController.xib
和MyViewController.swift
的xib 文件,并制作了MyViewController
类public
。
然后我创建一个新的 iOS 应用项目并将 TestFramework
作为嵌入框架添加到项目中。
我使用以下代码来测试框架。
let bundle = Bundle(for: MyViewController.self)
print("bundle:", bundle)
let vc = MyViewController(nibName: "MyViewController", bundle: bundle)
print("ViewController:", vc)
我得到了结果:
bundle: NSBundle </Users/xxx/TestApp.app> (loaded)
ViewController: <TestFramework.MyViewController: 0x7fce75403c40>
似乎一切正常。 但是当我尝试展示视图控制器时,它失败了。我得到了 NSInternalInconsistencyException。
self.present(vc, animated: false, completion: nil)
异常详情:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/xxx/TestApp.app> (loaded)' with name 'MyViewController''
任何想法。谢谢。
【问题讨论】:
似乎Bundle(for:)
初始化程序没有返回您期望的包。看起来它返回了你的主包。尝试比较从Bundle(for:)
和Bundle.main
获得的捆绑包。
哦,我认为静态链接是捆绑包的问题。
@VladRusu 你说得对,bundle
等于 Bundle.main
。在我将框架改回 Dynamic 后,一切正常。谢谢。但是我应该使用动态库吗,因为一些教程告诉我应该使用静态库。
【参考方案1】:
静态框架链接会将代码嵌入到应用程序的框架中,并且与动态库相比,框架中的所有类实际上都是主包的一部分。
但是,有一种使用静态框架资源的好方法,可以通过创建一个资源包来实现,该资源包将与静态框架链接,然后通过专门指向该包来加载资源。
-
在您的静态框架项目中,创建一个新包
将您的捆绑软件基础 SDK 更改为
Latest iOS
或您希望通过捆绑软件的 Build Settings
选项卡支持的任何平台
在项目检查器中,将捆绑包作为目标依赖项添加到 Build Phases
选项卡下的静态库中
在您的测试应用程序中,链接静态框架后,将您的资源包添加到Build Phases
选项卡中的Copy Bundle Resources
列表。
这就是设置,现在你可以在代码中使用它了:
guard let bundlePath = Bundle.main.path(forResource: "<your bundle name>" ofType: "bundle"),
let bundle = Bundle(path: bundlePath) else return
let viewController = MyViewController(nibName: "<your nib name>" bundle: bundle)
您也可以在静态框架中使用此代码,但您应始终注意,资源包应始终添加到使用该框架的每个应用的 Copy Bundle Resources
中。
在动态库/框架的情况下,类将从它们的包中动态加载,因此访问资源更加直接。
【讨论】:
以上是关于从框架加载 nib 文件时出现 NSInternalInconsistencyException的主要内容,如果未能解决你的问题,请参考以下文章