Какао: плагин не может открыть окно приложения - PullRequest
0 голосов
/ 09 марта 2010

Я разрабатываю плагин для OsiriX .

В этом приложении у меня 3-4 файла пера.Также для плагина есть файлы (.h & .m) с именем PluginFilter, в которых присутствует метод с именем - (long) filterImage: (NSString) menuName, с которого плагин начинает выполнение.Теперь моя проблема в том, что я возвращаю код для запуска главного окна в каком-то другом файле .m, и мне нужно вызвать этот файл, используя метод, упомянутый выше.

Приложение имеет несколько файлов пера,У меня есть имя плагина PluginFilter с именем:

- (long) filterImage:(NSString*) menuName

Плагин должен открывать окно при вызове этим методом.Код, который определяет оконный контроллер, находится в другом кончике.Когда я вызываю метод filterimage в плагине, окно никогда не появляется.

Вот мой метод filterImage:.

#import "XGridInOsiriXFilter.h"
#import "MainWindowController.h"

@implementation XGridInOsiriXFilter

- (void) initPlugin
{

}

- (long) filterImage:(NSString*) menuName
{

    MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init];
    [mainWindowController showWindow:self ];
    [mainWindowController release];

    return 0;
}

@end

При вызове метода возникают не предупреждения или ошибки,окно просто не появляется

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

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

@implementation YourPluginFilter

- (void) initPlugin
{
yourWindowController = [[YourWindowController alloc] init];
NSLog(@"Initialized YourWindowController");
}

- (long) filterImage:(NSString*) menuName
{
if (yourWindowController && [NSBundle loadNibNamed:@"YourNibName" owner:yourWindowController]) {
        NSLog(@"Activated yourWindowController");
    return 0;
} else {
    return -1;
}
}

@end
0 голосов
/ 09 марта 2010

Обычно вы не открываете главное окно приложения из плагина. Плагины по определению не всегда присутствуют, поэтому не стоит помещать в них критический код. Также вы не хотите, чтобы несколько плагинов открывали одно и то же логическое окно.

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

Основное приложение должно загружать и настраивать главное окно и вызывать только плагин для обработки содержимого окна.

Даже в этом случае технически возможно открыть окно из плагина, чтобы (1) плагин не загружался и метод не вызывался (введите точку останова / журнал для подтверждения) или (2) контроллер окна является неправильно настроен, чтобы он не открывал окно. Протестируйте контроллер вне плагина, чтобы убедиться, что он работает. Еще лучше, переместите код открытия окна за пределы плагина.

Edit01:

Из комментария:

Я внес некоторые изменения в вышеперечисленное код следующим образом

- (long) filterImage:(NSString*) menuName { 
    MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];            
    [mainWindowController showWindow:self ]; 
    [mainWindowController release]; 
    return 0; 
}

но он показывает, что нет -nit метод найден. Почему это так, потому что -init метод в файле MainWindowController.m

Ну, у вас здесь две проблемы.

(1) Вы задаете определение mainWindowController для класса MainWindowController, но инициализируете его классом GridSampleMainWindowController. Если MainWindowController является подклассом GridSampleMainWindowController, это будет работать, но будет выдавать предупреждения. Вместо этого вы должны инициализировать его как

GridSampleMainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];  

или

MainWindowController *mainWindowController = [[MainWindowController alloc] init:self]; 

(2) Вы отпускаете контроллер без каких-либо других предметов, удерживающих его, что убьет его. Когда оконный контроллер умирает, он освобождает окна, которыми он управляет. Скорее всего, вы ничего не видите.

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

На какой init метод он жалуется? Ваш initPlugin ничего не делает и возвращает void, если это фактический метод инициализации плагина, то плагин никогда не загрузится. По крайней мере, это должно выглядеть так:

- (id) initPlugin
{
    self=[super init];
    return self;
}

Похоже, вы пришли из чистого C-фона, который отлично подходит для этой среды, но вам нужно узнать об объектно-ориентированных частях языка Objective-C. Вы по-прежнему пишете методы, как если бы они были функциями С старой школы, и между ними есть важные и зачастую тонкие различия.

Извините, я пропустил все это вчера. Я увидел «плагин» и сосредоточился на неправильном аспекте проблемы.

Edit02:

Нет, я не говорю о моем initPlugin метод. Я говорю о моей инициации метод, который есть в Файл MainWindowController.m

- (id)init { 
      self = [super initWithWindowNibName:@"MainWindow"]; 
      return self; 
}

Это вернет экземпляр суперкласса MainWindowController. Если вы не выполняете никаких настроек, вам не нужно переопределять метод init в вашем подклассе. Просто используйте унаследованную версию так:

MainWindowController *mainWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindow"]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...