从框架加载 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.xibMyViewController.swift 的xib 文件,并制作了MyViewControllerpublic

然后我创建一个新的 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Interface Builder 中设置 Nib Name 字段时出现异常

从框架加载 nib 文件

从包中加载 NIB 时出现异常

iOS 8 键盘扩展:出现呼叫栏时出现约束错误?

从框架加载 .xib 文件

如何在框架内加载 `.xib` / `.nib` 文件?