2013-02-10 5 views
0

XCODE와 Objective-C를 사용하는 MAC에서 회 전체와 취소 버튼이 포함 된 작은 "BUSY"창을 표시해야합니다. 이렇게하면 길어진 작업을 마칠 때까지 사용자가 응용 프로그램에서 다른 작업을 수행하지 못하지만 취소를 클릭하면 작업이 중지됩니다.MAC에서 취소 버튼과 회 전자로 바쁜 창을 표시해야합니다

나는 .... 지금처럼 취소 버튼으로 간단 NSWindowController를 기반으로 창을 만들고 창 모달을

-(void) start_long_operation {
...
를 ... 시도

[self showBusy]; 
return; // return to continue the long operation 
} 

// 사용자가 수행 할 때까지 아무 작업도 수행 할 수 없도록 "사용중"대화 상자를 표시합니다.

-(void) showBusy { 
    BusyNSWindow *loadingView = [[LoadingView alloc] initWithWindowNibName:@"LoadingView"];<br> 
    [[NSApplication sharedApplication] runModalForWindow:loadingView.window]; 
} 
클릭 취소 할 경우 6,

는 신호가 긴 작업을 닫습니다 "중"대화 상자

-(IBAction) cancel 
{ 
// cancel was clicked inside the "busy" dialog box so signal process to stop long operation 
} 



하지만 발생하기는 [[NSApplication sharedApplication] runModalForWindow:loadingView.window] 및 나던 반환 내부에 남아 있다는 것입니다을 중지합니다 //. "바쁜"대화 상자가 작동하는 동안 긴 처리를 계속할 수 있도록 반환해야하므로 작동하지 않습니다.

누구나 취소 버튼과 회 전자가있는 작은 "사용중"창을 만드는 방법을 알고 있으므로 작업이 완료 될 때까지 사용자가 해당 창 외부를 클릭하지 못하게하고 나머지 프로그램을 정상적으로 계속할 수 있도록합니다. 그것은 긴 작업을 처리 할 수 ​​있습니까?

-rough_neck

답변

0

긴 작업은 어쨌든 메인 스레드에서 수행해서는 안됩니다. 장기 실행 작업에는 NSOperationNSOperationQueue을 사용하십시오. 따라서 백그라운드에서 실행되므로 모달 창이 잘 작동합니다.

또 다른 대안이지만 훨씬 편리하지 않지만 "모달 세션"을 사용하는 것이 좋습니다. -beginModalSessionForWindow:, -runModalSession:-endModalSession: 방법은 NSApplication입니다. 이를 위해서는 장기 실행 작업을 순차적으로 호출 할 수있는 빠른 실행 단계로 나누어야합니다.