可可:插件无法打开应用程序窗口
-
18-09-2019 - |
题
我开发 OsiriX 的一个插件。
在该应用程序我有3-4笔尖文件。此外,在对插件有文件(.H&.M)称为PluginFilter其中方法调用 - (长)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
调用方法产生不警告或错误,该窗口只是没有出现。
解决方案
您通常不会从一个插件打开应用程序的主窗口。通过定义插件我并不总是存在的,所以你不应该把关键的代码在其中。无论你会想多个插件打开同一个逻辑窗口。
相反,在主窗口应由应用程序委托作为正常的,但在 内容显示窗口的强>可以通过插件处理如果插件是可用的。
的主要应用程序应该加载和配置在主窗口和来电插件来处理窗口中的内容。
即使这样在技术上是可能从插件打开一个窗口,以便:(1)将插件没有被加载,并且该方法没有被调用(插入断点/登录确认)或(2)的窗口控制器是配置错误使得它不会打开的窗口。测试控制器插件之外,以确认它的工作原理。更重要的是,移动插件窗外开放代码。
Edit01:
从评论:
我已在上面的一些变化 代码如下
- (long) filterImage:(NSString*) menuName {
MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];
[mainWindowController showWindow:self ];
[mainWindowController release];
return 0;
}
却是露出wanring没有 -init方法发现。为什么它显示像这样因为-init方法是DER 在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语言的面向对象的部分。你还在写作方法,好像他们是老派的C函数和有重要和经常次细微的差别。
对不起,我这一切昨天错过。我看到“插件”,并专注于问题的错误方面。
Edit02:
不,我不是在谈论我的initPlugin 方法。我说的是我的init 方法,该方法是在有 MainWindowController.m文件
- (id)init {
self = [super initWithWindowNibName:@"MainWindow"];
return self;
}
这将返回MainWindowController
的超类的一个实例。如果你没有做任何定制,你没有必要在你的子类覆盖init方法。只是使用继承版本正是如此:
MainWindowController *mainWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindow"];
其他提示
我认识到这一点可能是未来有点晚,但我一直在寻找一种方法可以做到你所要求的,发现它同样的事情。您可以使用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