Обычно вы не открываете главное окно приложения из плагина. Плагины по определению не всегда присутствуют, поэтому не стоит помещать в них критический код. Также вы не хотите, чтобы несколько плагинов открывали одно и то же логическое окно.
Вместо этого основное окно должно отображаться делегатом приложения в обычном режиме, но содержимое окна может обрабатываться плагином, если плагин доступен.
Основное приложение должно загружать и настраивать главное окно и вызывать только плагин для обработки содержимого окна.
Даже в этом случае технически возможно открыть окно из плагина, чтобы (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"];