質問

私はこのコードを使用しています:

    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    [openPanel beginForDirectory:nil file:nil types:[NSImage imageFileTypes] modelessDelegate:self didEndSelector:NULL contextInfo:NULL];

このメソッドにコードのみです。メソッドが呼び出されると、オープンパネルが消え、その後秒間画面上に表示されます。私はこれを防ぐにはどうすればよい?

感謝します。

役に立ちましたか?

解決

パネルは非ブロッキングであるので、パネルが開いた後、

、コードの実行が継続されます。あなたはどこかへの参照を保持していないので、オープンパネルが割り当て解除されています。 -openPanelコンビニエンスコンストラクタであり、コレクタが次に実行されると、現在の自動解放プールは、(GCアプリで)ポップされたとき、または離れて行く自動解放オブジェクトを返します。あなたのケースでは、これはすぐにあなたの方法が終了したようです。

あなたはパネルが固執したい場合は、

は、あなたが特に-retainを使用して、それを保持し、その後didEndSelectorでそれを-release必要があります:

- (void)showPanel
{
    NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain]; //note the retain
    [openPanel beginForDirectory:nil 
                            file:nil 
                           types:[NSImage imageFileTypes] 
                modelessDelegate:self 
                  didEndSelector:@selector(myOpenPanelDidEnd:returnCode:contextInfo:)
                     contextInfo:NULL];
}

- (void)myOpenPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void*)contextInfo
{
    NSArray* fileNames = [panel filenames];
    [panel release];
    //do something with fileNames
}

あなたはガベージコレクション、retainとreleaseを使用している場合はノーオペレーションではないので、あなたではなく、そのようなインスタンス変数に格納するよう、NSOpenPanelへの強い参照を格納する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top