通常、プラグインからアプリのメインウィンドウを開くことはありません。定義上、プラグインは常に存在するとは限らないため、重要なコードをプラグインに含めるべきではありません。また、複数のプラグインが同じ論理ウィンドウを開くことも望ましくありません。
代わりに、メインウィンドウは通常どおりアプリデリゲートによって表示される必要がありますが、プラグインが使用可能な場合は、ウィンドウのコンテンツをプラグインで処理できます。
メインアプリケーションはメインウィンドウをロードして構成し、プラグインを呼び出してウィンドウのコンテンツを処理する必要があります。
それでも、プラグインからウィンドウを開くことは技術的に可能であるため、(1)プラグインがロードされておらず、メソッドが呼び出されていません(確認のためにブレークポイント/ログを挿入)、または(2)ウィンドウコントローラーが誤って構成されているため、ウィンドウは開きません。プラグインの外部でコントローラーをテストして、機能することを確認します。さらに良いことに、ウィンドウを開くコードをプラグインの外に移動します。
Edit01:
コメントから:
上記のコードに次のように変更を加えました
- (long) filterImage:(NSString*) menuName {
MainWindowController *mainWindowController = [[GridSampleMainWindowController alloc] init:self];
[mainWindowController showWindow:self ];
[mainWindowController release];
return 0;
}
しかし、-initメソッドが見つからないことを望んでいることを示しています。MainWindowController.mファイルの-initメソッドがderであるため、このように表示される理由
さて、ここで2つの問題があります。
(1)definemainWindowController
をclassとして設定しますが、classMainWindowController
で初期化します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メソッドについて話していません。MainWindowController.mファイルにある私のinitメソッドについて話している
- (id)init {
self = [super initWithWindowNibName:@"MainWindow"];
return self;
}
MainWindowController
これにより、のスーパークラスのインスタンスが返されます。カスタマイズを行っていない場合は、サブクラスのinitメソッドをオーバーライドする必要はありません。したがって、継承されたバージョンを使用するだけです。
MainWindowController *mainWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindow"];