在基于文档的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自然无法在我的Plugin类中设置顶级对象引用,我怀疑mainBundle与Plugin的bundle无关.
我将如何实现这一目标?有没有办法找到"当前"的包(插件类来自的包,所以说)?
谢谢.
我不清楚你究竟在问什么 - 你的应用程序包中没有的"加载类"来自哪里,你在"加载类"中究竟是什么意思?
也许以下内容会有所帮助:
loadNibNamed:owner:topLevelObjects:
是一个实例方法,并从实例表示的包中加载.
在您的示例中,您使用的实例[NSBundle mainBundle]
是通过via获取的,因此从应用程序主包中加载了nib.
没有"当前捆绑"概念,但您可以获得NSBundle
表示其他捆绑的实例,例如使用NSBundle
"类"方法bundleWithURL
.因此,要从另一个bundle加载一个nib,首先创建一个NSURL
引用该bundle,然后NSBundle
根据它创建一个nib,最后加载nib.
HTH
附录 - 问题更新后
从弃用+loadNibName:owner:
方法的描述owner
:
如果此对象的类具有关联的包,则搜索该包以查找指定的nib文件; 否则,此方法在主捆绑中查找.
这是您在使用时需要复制的内容-loadNibNamed:owner:topLevelObjects:
.你需要该方法NSBundle
的bundleForClass:
返回的NSBundle
动态加载的类对象.
因此,在您的Plugin
课程中,您应该能够找到它所加载的包[NSBundle bundleForClass:[self class]]
,然后调用-loadNibNamed:owner:topLevelObjects:
它.