【问题标题】:Cannot load xib from framework无法从框架加载 xib
【发布时间】:2022-01-02 06:24:15
【问题描述】:

我似乎无法在我创建的框架中加载 nib 文件。问题是我在它上面工作了一个多月,它工作得很好。 2周后我今天再次打开它,它只是崩溃了。我简直不敢相信。

我创建了一个小样本project,我可以在其中重现该问题。

获取我正在使用的捆绑包

let bundle = Bundle(identifier: "com.nibFramework.NibFramework")

顺便说一句,这将返回 nil。

所以我尝试了

let bundle = Bundle(for: MyNib.self)

使用笔尖

let nib = UINib(nibName: "\(MyNib.self)", bundle: bundle)
let array = nib.instantiate(withOwner: self, options: nil)

这在instantiate 上崩溃了。

Error
2021-11-23 23:55:52.381944+0530 NibApp[7432:2147418] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </private/var/containers/Bundle/Application/7817FD25-54BC-4920-AC67-49D246D28794/NibApp.app> (loaded)' with name 'MyNib''
*** First throw call stack:
(0x1827f904c 0x19ae6df54 0x182850180 0x18513f338 0x1040b0d9c 0x1040af164 0x1040af1c0 0x184db415c 0x184db6c10 0x184d896a4 0x184ecc4d8 0x184e21da0 0x184eb8f84 0x184ed3598 0x184c594a0 0x184f5f584 0x185260400 0x184f61c80 0x184ea10b4 0x1942f0e20 0x194316cdc 0x1942d16b4 0x1942d2cf4 0x10441e3b4 0x104421e70 0x1942d2f94 0x1942d23d4 0x1942d69e4 0x18281b020 0x18282bce0 0x182766054 0x18276b7f4 0x18277f3b8 0x19e10f38c 0x18511f6a8 0x184e9e7f4 0x199e98184 0x1040afcb8 0x1040afc40 0x1040afd38 0x104325a24)
libc++abi: terminating with uncaught exception of type NSException
dyld4 config: DYLD_LIBRARY_PATH=/usr/lib/system/introspection DYLD_INSERT_LIBRARIES=/Developer/usr/lib/libBacktraceRecording.dylib:/Developer/usr/lib/libMainThreadChecker.dylib:/Developer/Library/PrivateFrameworks/DTDDISupport.framework/libViewDebuggerSupport.dylib
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </private/var/containers/Bundle/Application/7817FD25-54BC-4920-AC67-49D246D28794/NibApp.app> (loaded)' with name 'MyNib''
terminating with uncaught exception of type NSException

我使用的是 Xcode 13.1。这个框架的Mach-O Type设置为Static Library

很确定我错过了一些简单的事情。就是想不通是什么。感谢您的帮助。

【问题讨论】:

  • 您首先做了一些好的方法。尝试使用它提供的标准路径查看 Bundle 输出的内容。当 nib 在框架中时,检查 NSString *privatePath = [[NSBundle mainBundle] privateFrameworksPath]; sorry objc 的输出。因为框架的东西不在资源文件夹中,所以标准查找不能按原样工作。
  • @OlSen 运行该代码给了我/private/var/containers/Bundle/Application/69CA5508-5C73-4309-BEC8-91C958069808/NibApp.app/Frameworks 。所以我使用let bundle = Bundle(path: path),但它仍然崩溃。
  • 可以使用SPM吗?使用 SPM,您将拥有 Bundle.module 的模块资源

标签: ios swift objective-c xcode xcframework


【解决方案1】:

使用 Xcodes 模板创建的任何框架包都将具有一个结构,您可以在查找其中包含的内容时依赖该结构。

Nib/Xib 文件是资源,因此在编译时它们最终会被复制到创建的 Bundle(在本例中为框架)的相应子文件夹中。 所以你应该能够手动构建所需的资源文件夹。

NSString *privateFWPath = [[NSBundle mainBundle] privateFrameworksPath];
NSString *nibPath = [privateFWPath stringByAppendingString:@"/NibFramework.framework/Versions/A/Resources/MyNib"];

另一种方法是向类询问其捆绑包并构建框架资源文件夹以到达 nib。

[NSBundle bundleForClass:MyNib.class];

PS:猜测MyNib.self 不是一个类,它是一个对象。 检查 nib/xib 是否最终在框架中的一种方法是使用桌面 Finder.app 爬过文件夹结构。您的应用程序将有一个 Frameworks 文件夹,其中有一个 NibFramework.framework 并在此链接到更深入结构的资源或直接一个 Versions 文件夹,子文件夹 A 应该在其中找到 Resources 文件夹,并且 nib 将驻留在其中。为此,您当然首先要编译,然后在 Xcode 项目中选择产品,右键单击 > 显示Finder,然后右键单击 > 显示内容。

提示:当输入给定的结果为 (nil) 或 (null) 时,向 Bundle 询问内容有副作用,然后通常返回 mainBundle。

提醒:nib/xib/storyboard 文件不驻留在包的根文件夹中。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2019-10-01
    • 2013-08-09
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2012-05-14
    相关资源
    最近更新 更多