0

OsiriX用のプラグインを開発しています。

そのアプリでは、3〜4個のnibファイルがあります。また、プラグインの場合、PluginFilterというファイル(.h&.m)があり、-(long)filterImage:(NSString)menuNameというメソッドがあり、そこからプラグインが実行を開始します。今私の問題は、メインウィンドウを起動するコードを他の.mファイルに戻し、上記の方法を使用してそのファイルを呼び出さなければならないことです。

アプリには複数のnibファイルがあります。私はプラグイン名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

メソッドを呼び出しても警告やエラーは発生せず、ウィンドウが表示されないだけです。

4

2 に答える 2

1

これは少し遅すぎるかもしれませんが、あなたが求めているのと同じことを行う方法を探していて、見つけました. を使用NSBundleして目的の nib をロードし、それをインスタンス化されたコントローラーに向けることができます。お気に入り:

@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
于 2011-04-06T14:54:08.183 に答える
0

通常、プラグインからアプリのメインウィンドウを開くことはありません。定義上、プラグインは常に存在するとは限らないため、重要なコードをプラグインに含めるべきではありません。また、複数のプラグインが同じ論理ウィンドウを開くことも望ましくありません。

代わりに、メインウィンドウは通常どおりアプリデリゲートによって表示される必要がありますが、プラグインが使用可能な場合は、ウィンドウのコンテンツをプラグインで処理できます。

メインアプリケーションはメインウィンドウをロードして構成し、プラグインを呼び出してウィンドウのコンテンツを処理する必要があります。

それでも、プラグインからウィンドウを開くことは技術的に可能であるため、(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で初期化しますGridSampleMainWindowControllerMainWindowController がこのサブクラスの場合は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"]; 
于 2010-03-09T13:54:51.597 に答える