ココア:プラグインがうまくいかないアプリ画面
-
18-09-2019 - |
質問
私は開発プラグイン 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
メソッドを呼び出すと、生産しない警告やエラー、ウィンドウだけが表示されます。
解決
だが正常に開いていないアプリのメインウィンドウからの引き出しおよび設定ができますプラグインによる定義はないが常に存在できな重要なコードします。いたいで複数のプラグイン開と同じ論理的なウインドウです。
その代わりに、メインウィンドウを表示する必要があるでは、このアプリによって代表として通常のもの コンテンツ ウィンドウので加工できるプラグインの場合はプラグインが可能です。
メインのアプリケーションは負荷に合わせて構成されていますメインウィンドウのみお電話でのプラグインの内容に面しています。
もうすることは技術的に可能であるため、窓を開けてからプラグインをしているとそうではない(1)プラグインはロードの方法はないという側ブレークポイントを設定/ログの確認)又は(2)の画面コントローラmisconfiguredないようにウィンドウを開きます。試験はコントローラ以外のプラグインを確認します。しみいただけるよう、窓口コードの外に引き出しおよび設定ができます
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)リリースのコントローラなどのオブジェクトを保持するようにします。がウィンドウコントローラ金型でdeallocatesのwindowsで制御できます。これはなぜださい。
だうえしたいクラスのコントローラを設定して保有物件のプラグインのクラスがきれいに保つことができ、その画面です。
る init
方法で不満ですか?ご initPlugin
何もしないと返します void
このプラグインの実際の初期化メソッドのプラグインのない負荷時のものです。できていれば次のようになるはずです:
- (id) initPlugin
{
self=[super init];
return self;
}
ですから、純粋なC背景では、サマーフェスティバルのこの環境が必要なつのオブジェクト指向のパーツObjective-C言語です。まだ書き込みメソッドをしていた旧校Cの機能は重要であり、oft時の微妙な違いがある。
残念だったので買ってきたすべてのことです。見た"プラグイン"に焦点をあて間違った側面の問題です。
Edit02:
なっていない私のinitPlugin 方法。しかし私が自分のinit 方法はあり MainWindowController.mファイル
- (id)init {
self = [super initWithWindowNibName:@"MainWindow"];
return self;
}
このインスタンスを返す MainWindowController
'sスーパークラスです。だだけ電源をオンにする"というカスタマイズが不要のオーバーライドは、initメソッドできるサブクラス.ものを受け継版thusly:
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