如何在框架内加载 `.xib` / `.nib` 文件?
How to load a `.xib` / `.nib` file within a framework?
我正在将 iOS 库作为 Cocoa Pod。在这个库中,我有一个自定义视图:
@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
被添加到 "copy bundle resources" 构建阶段
我如何从我的我的库中加载我的库中的class文件library when 运行 一个应用程序只包含我的库作为 .framework
?
我相信如果我手动指定文件的路径,我可以让它工作:
NSString* resourcePath = [[NSBundle mainBundle] pathForResource:@"bfsdk" ofType:@"framework"];
[[NSBundle mainBundle] loadNibNamed:[resourcePath stringByAppendingPathComponent:@"PlayerView"]];
但是我不喜欢这让我将我的框架名称硬编码到我的 classes 之一。如果我在一年内更改名称,我不希望因为这一行无人记得存在的隐藏代码而破坏一切。
应该够用了
[NSBundle bundleForClass:[self class]]
代替
[NSBundle mainBundle]
所以基本上 [NSBundle mainBundle] returns 当前模块的包是你的应用程序,而不是实际的框架
在这里您可以找到更多详细信息
[NSBundle bundleForClass:[self class]]] what does that mean?
我正在将 iOS 库作为 Cocoa Pod。在这个库中,我有一个自定义视图:
@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
被添加到 "copy bundle resources" 构建阶段
我如何从我的我的库中加载我的库中的class文件library when 运行 一个应用程序只包含我的库作为 .framework
?
我相信如果我手动指定文件的路径,我可以让它工作:
NSString* resourcePath = [[NSBundle mainBundle] pathForResource:@"bfsdk" ofType:@"framework"];
[[NSBundle mainBundle] loadNibNamed:[resourcePath stringByAppendingPathComponent:@"PlayerView"]];
但是我不喜欢这让我将我的框架名称硬编码到我的 classes 之一。如果我在一年内更改名称,我不希望因为这一行无人记得存在的隐藏代码而破坏一切。
应该够用了
[NSBundle bundleForClass:[self class]]
代替
[NSBundle mainBundle]
所以基本上 [NSBundle mainBundle] returns 当前模块的包是你的应用程序,而不是实际的框架
在这里您可以找到更多详细信息 [NSBundle bundleForClass:[self class]]] what does that mean?