2014-01-15 11 views
3

在基於文檔可可應用程序中,我使用實例化從外部束幾個對象(插件):可可 - loadNibNamed:所有者:topLevelObjects:從加載束

- (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上加載,它將根視圖與我的插件類中的屬性綁定。下面以一個最小的插件類的定義:

@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類來自的包,可以這麼說)?

謝謝。

回答

6

這是我不清楚究竟什麼你問 - 哪裏是「加載類」,是不是在你的應用程序包來自何方,究竟什麼叫「類加載」是什麼意思?

也許下面將幫助:

loadNibNamed:owner:topLevelObjects:是從實例表示束的實例方法和負載。

在您的樣品您使用了通過[NSBundle mainBundle]獲得,所以筆尖從應用程序主束加載的實例。

沒有「當前捆綁」的概念,但可以得到NSBundle實例表示其他包,例如用NSBundle的分類方法bundleWithURL。所以加載從不同的包筆尖首先創建一個NSURL引用包,然後創建基於一個NSBundle,最後加載筆尖。

HTH

附錄 - 問題更新

owner棄用的+loadNibName:owner:方法的描述後:

如果此對象的類都有一個對應的捆綁,即捆綁搜索爲指定的nib文件;否則,此方法在主包中查找。

這是使用-loadNibNamed:owner:topLevelObjects:時需要複製的內容。你需要的方法NSBundlebundleForClass:它返回NSBundle對象動態加載的類。

因此,在您的Plugin類中,您應該能夠找到從[NSBundle bundleForClass:[self class]]加載的軟件包,然後在其上調用-loadNibNamed:owner:topLevelObjects:

+0

感謝您的回答。我擴大了這個問題,使其更具體。 – insys

+0

@ user2311023 - 查看已更新問題的更新答案。 – CRD

+0

從舊方法的偉大洞察力!這很好,非常感謝。 – insys

相關問題