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

Posted

技术标签:

【中文标题】如何在框架内加载 `.xib` / `.nib` 文件?【英文标题】:How to load a `.xib` / `.nib` file within a framework? 【发布时间】:2019-07-12 19:39:28 【问题描述】:

我正在开发一个作为 Cocoa Pod 的 ios 库。在这个库中,我有一个自定义视图:

@interface PlayerView : UIView

@property (strong, nonatomic) IBOutlet UIView *contentView;

@end
@implementation PlayerView

- (instancetype) initWithCoder:(NSCoder*)coder

    self = [super initWithCoder:coder];
    [self initialize];
    return self;


- (instancetype) initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    [self initialize];
    return self;


- (void)initialize

    [[NSBundle mainBundle] loadNibNamed:@"PlayerView" owner:self options:nil];
    [self addSubview:contentView];


@end

在这种情况下,contentView.xib 中定义的整个视图,其中包括图像和标签。

当我构建我的演示应用程序(和库)时,应用程序会运行,但在显示此视图时出现以下错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/stevenbarnett/Library/Developer/CoreSimulator/Devices/EC244A5F-CE57-4CCD-9BB4-CDC834D74812/data/Containers/Bundle/Application/446EB609-B663-4BD5-8F8D-F22D03BC0B18/bfsdk_Example.app> (loaded)' with name 'PlayerView''

手动检查.app 文件,可以发现PlayerView.nib 文件隐藏在Frameworks/bfsdk.framework 目录中,但我猜是因为它不在根目录下,所以没有找到:

我已验证:

文件所有者设置为PlayerView PlayerView.xib 被添加到“复制捆绑资源”构建阶段

在运行仅将我的库作为@987654336 包含我的库的应用程序时,如何从我的库 的类中加载我的库中.xib 文件@?

如果我手动指定文件的路径,我相信我可以让它工作:

NSString* resourcePath = [[NSBundle mainBundle] pathForResource:@"bfsdk" ofType:@"framework"];
[[NSBundle mainBundle] loadNibNamed:[resourcePath stringByAppendingPathComponent:@"PlayerView"]];

但是我不喜欢这样,我将框架的名称硬编码到我的一个类中。如果我在一年内更改名称,我不希望一切都因为这一行无人记得的隐藏代码而中断。

【问题讨论】:

【参考方案1】:

应该够用了

[NSBundle bundleForClass:[self class]] 代替 [NSBundle mainBundle]

所以基本上 [NSBundle mainBundle] 返回当前模块的包,这是您的应用程序,而不是实际的框架

在这里您可以找到更多详细信息 [NSBundle bundleForClass:[self class]]] what does that mean?

【讨论】:

以上是关于如何在框架内加载 `.xib` / `.nib` 文件?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序在主 window.xib 上运行时如何使用新的 nib 文件加载应用程序

如何在 iOS 中从 NIB 加载 NIB

Interface Builder:如何从 nib 文件加载视图

界面生成器:如何加载 nib 文件

为啥这段代码不能加载我的 NIB/XIB

并加载 NIB / XIB 文件?