オープンパネルは、すぐに消えて表示されます
-
19-09-2019 - |
質問
私はこのコードを使用しています:
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
への強い参照を格納する必要があります。
所属していません StackOverflow