1

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

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

これは、メソッド内の唯一のコードです。メソッドが呼び出されると、開いているパネルが画面に 1 秒間表示されてから消えます。これを防ぐにはどうすればよいですか?

ありがとう。

4

1 に答える 1

2

パネルはノンブロッキングであるため、パネルが開くとコードの実行が続行されます。どこかへの参照を保持していないため、開いているパネルの割り当てが解除されています。-openPanel便利なコンストラクターであり、現在の自動解放プールがポップされたとき、または (GC アプリで) コレクターが次に実行されたときに消える自動解放されたオブジェクトを返します。あなたの場合、これはメソッドが終了するとすぐです。

パネルを固定したい場合は、 を使用して明確に保持し-retain、その後-releasedidEndSelector で保持する必要があります。

- (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、インスタンス変数に格納するなど、代わりに への強い参照を格納する必要があります。

于 2010-02-09T07:10:56.577 に答える