문제

이 코드를 사용하고 있습니다.

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

이것은 메소드의 유일한 코드입니다. 메소드가 호출되면 열린 패널이 화면에 잠시 나타나면 사라집니다. 이것을 어떻게 방지합니까?

감사.

도움이 되었습니까?

해결책

패널이 차단하지 않으므로 패널이 열리면 코드 실행이 계속됩니다. 오픈 패널은 어딘가에 대한 참조를 보유하고 있지 않기 때문에 거래되고 있습니다. -openPanel 편의 생성자이며 현재 자동 제출 풀이 팝업 될 때 또는 컬렉터가 다음 실행될 때 (GC 앱에서) 사라질 자동 엘리트 객체를 반환합니다. 귀하의 경우, 이것은 귀하의 방법이 끝나 자마자입니다.

패널을 고수하려면 특별히 사용해야합니다. -retain, 그리고 그 후에 -release didendselector에서 :

- (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
}

가비지 컬렉션을 사용하는 경우 유지 및 출시는 No-OPS이므로 대신에 강력한 참조를 저장해야합니다. NSOpenPanel, 인스턴스 변수에 저장하는 것과 같은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top