在基于文档的 Cocoa 应用程序中,我使用以下方法实例化外部包中的多个对象(插件):
- (NSMutableArray *)getPluginsOfType:(Class)type;
{
NSBundle *main = [NSBundle mainBundle];
NSArray *allPlugins = [main pathsForResourcesOfType:@"bundle" inDirectory:@"../PlugIns"];
NSMutableArray *availablePlugins = [NSMutableArray array];
for (NSString *path in allPlugins)
{
NSBundle *pluginBundle = [NSBundle bundleWithPath:path];
[pluginBundle load];
Class principalClass = [pluginBundle principalClass];
[availablePlugins addObject:principalClass];
}
return availablePlugins;
}
在每个文件中,都会在 init 时加载一个 nib 文件,它将根视图与我的插件类中的属性绑定在一起。下面是最小的插件类定义:
@interface Plugin
@property (strong) IBOutlet NSView *thePluginView;
@end
@implementation Plugin
- (instancetype)init
{
self = [super init];
if (self)
{
[NSBundle loadNibNamed:@"NibName" owner:self];
}
return self;
}
@end
虽然这工作正常,但我想替换上面对 NSBundle 的调用(因为 OS X 10.8+ 已弃用它),并将其替换为:
[[NSBundle mainBundle] loadNibNamed:@"NibName" owner:self topLevelObjects:nil];
但是,在这种情况下使用 mainBundle 自然无法在我的插件类中设置顶级对象引用,我怀疑原因 mainBundle 与插件的包无关。
我将如何实现这一目标?有没有办法找到“当前”包(可以说,插件类来自的包)?
Thanks.
我不清楚你到底在问什么 - 不在你的应用程序包中的“加载类”来自哪里,以及“加载类”到底是什么意思?
也许以下内容会有所帮助:
loadNibNamed:owner:topLevelObjects:
是一个实例方法,从实例代表的包中加载。
在您的示例中,您使用的实例通过以下方式获得[NSBundle mainBundle]
,因此笔尖是从应用程序主包加载的。
没有“当前捆绑包”概念,但您可以获得NSBundle
代表其他捆绑包的实例,例如和NSBundle
的类方法bundleWithURL
。因此,要从不同的包加载笔尖,首先创建一个NSURL
引用该包,然后创建一个NSBundle
在此基础上,最后加载笔尖。
HTH
附录 - 问题更新后
从已弃用的+loadNibName:owner:
方法的描述owner
:
如果该对象的类有关联的包,则在该包中搜索指定的 nib 文件;否则,此方法将在主包中查找。
这是您使用时需要复制的内容-loadNibNamed:owner:topLevelObjects:
。你需要的方法是NSBundle
's bundleForClass:
它返回NSBundle
动态加载类的对象。
所以在你的Plugin
类,你应该能够找到它加载的包[NSBundle bundleForClass:[self class]]
然后打电话-loadNibNamed:owner:topLevelObjects:
关于这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)