NSBundle загружает NSViewController - PullRequest
3 голосов
/ 27 мая 2010

Я изучаю проект, который будет загружать пользовательские NSBundles, которые включают NSViewController. В моей основной программе у меня есть этот код для работы с пакетом после его загрузки ...

id principalClass = [loadedBundle principalClass];
id instance = [[principalClass alloc] init];
[localLabel setStringValue:[instance name]];
NSView *incomingView = [[instance viewController] view];
[localView addSubview:incomingView];
[localView display];

И метод init основных классов в комплекте выглядит следующим образом ...

-(id) init {
    if(self = [super init]){
        name = @"My Plugin";
        viewController = [[ViewController alloc] initWithNibName:@"View" bundle:nil];
    }
    return self;
}

View.nib - это перо, расположенное в проекте bundles. Но всякий раз, когда я загружаю пакет, я получаю эту ошибку ...

2010-05-27 09: 11: 18.423 PluginLoader [45032: a0f] не может найти перо с именем: Просмотреть в пути пакета: (ноль) 2010-05-27 09: 11: 18.424 PluginLoader [45032: a0f] - [NSViewController loadView] не смог загрузить перо «View».

Я знаю, что у меня все подключено, потому что строка [label setStringValue:[instance name]]; правильно устанавливает текст метки. Плюс, если я возьму все предложения в комплекте и загрузлю их в свой основной проект приложений, все будет работать как положено. Любые мысли о том, как я могу правильно ссылаться на «Вид» в моем комплекте?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 мая 2010

В методе init вы не должны передавать nil параметру bundle.В соответствии с документацией UIViewController , передача nil приведет к поиску файла NIB в основном пакете (в приложении), что не является тем, что вам нужно.

Обойти это можно,используя специализированный инициализатор, такой как:

- (id) initWithBundle:(NSBundle *)bundle {
    if(self = [super init]){
        name = @"My Plugin";
        viewController = [[ViewController alloc] initWithNibName:@"View" bundle:bundle];
    }
    return self;
}

И используйте его следующим образом:

Class principalClass = [loadedBundle principalClass];
id instance = [[principalClass alloc] initWithBundle:loadedBundle];
0 голосов
/ 27 мая 2010

"View.xib - это перо"? Либо это XIB, либо это NIB. Ксиб это не перо. XIB-файлы могут использоваться только в конструкторе интерфейсов, в приложениях развертывания они должны быть преобразованы в NIB-файлы. Это то, что делает ibtool. Xcode не просто копирует ваши xib-файлы, он запускает их через ibtool, который преобразует их в nib-файлы, которые затем помещаются в папку Resources.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...