2014-01-15 9 views
3

, 내가 사용하여 외부 번들에서 여러 개체 (플러그인)을 인스턴스화하고로드 번들 : 소유자 : topLevelObjects 그 각각의 내코코아 - loadNibNamed : 문서 기반의 코코아 응용 프로그램에서

- (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에로드되며, 루트 뷰를 내 플러그인 클래스의 속성으로 바인딩합니다. 최소한의 플러그인 클래스 정의 아래 :

[[NSBundle mainBundle] loadNibNamed:@"NibName" owner:self topLevelObjects:nil]; 
:

@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+을 위해 사용되지 않는 있기 때문에)에 위의 호출을 대체하고, 그것을 대체 할

그러나이 경우 mainBundle을 사용하면 당연히 내 Plugin 클래스에서 최상위 수준의 객체 참조를 설정하지 못하고 mainBundle이 Plugin의 번들과 아무 관련이 없다고 생각됩니다.

어떻게 달성 할 수 있습니까? "현재"번들 (아마도 플러그인 클래스가 나온 번들)을 찾을 수있는 방법이 있습니까?

감사합니다.

답변

6

정확히 무엇을 요구하고 있는지 명확하지 않습니다. 애플리케이션 번들에없는 "로딩 클래스"는 어디에 있으며, "로딩 클래스"는 정확히 무엇을 의미합니까?

은 아마 다음은 도움이 될 것입니다

loadNibNamed:owner:topLevelObjects: 인스턴스가 나타내는 번들에서 인스턴스 메서드로드입니다.

샘플에 사용 된 인스턴스는 [NSBundle mainBundle]을 통해 얻습니다. 따라서 nib는 응용 프로그램 기본 번들에서로드됩니다.

"현재 번들"개념은 없지만 다른 번들을 나타내는 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