비교적 긴 작업이 있습니다. 그래서 나는 별도의 창 (NSWindowController)을 AppDelegate에서 가져 와서 진행 상황을 보여줍니다. 그것은 같습니다.창 닫기 및 NSWindowController 해제
//AppDelegate.m
if (self.progresswindow == nil) {
self.progresswindow = [[ProgressController alloc] initWithWindowNibName:@"ProgressController"];
}
[progresswindow showWindow:self];
//[[progresswindow window] setReleasedWhenClosed:NO];
[NSApp runModalForWindow:progresswindow.window];
작업이 완료되면 진행 창이 닫힙니다.
//ProgressController.m
[NSApp stopModal];
[self close];
잘 작동합니다. 그러나 버튼을 클릭하여 동일한 창으로 작업의 다른 세션을 시작하면 애플리케이션이 열리지 만 작업이 실행되지 않습니다. 마지막 인스턴스가 공개되지 않은 것처럼 보입니다. 진행 창에는 다음과 같은 행이 있습니다.
- (void)windowDidLoad {
NSLog(@"Hey!");
}
NSLog는 두 번째로 호출되지 않습니다. 내가 뭘 잘못하고 있는지 궁금해? setReleasedWhenClosed를 호출하면 AppDelegate에서이 적용되지 않습니다. 그래도 체크 박스를 사용 중지 한 경우 릴리스가 있습니다. 나는 내가 그것을 닫을 때 풀어 놓을 수 있도록 different topic의 진행 창을 NSWindowWillCloseNotification 관찰 할 필요가있는 것을 읽었다. 하지만 ARC을 사용하고 있습니다. 그래서 수동으로 출시 할 수는 없습니까? 한편, Apple의 샘플 (TableViewPlayground)을 열면이 알림이 사용 된 것으로 보입니다. 또한 this topic과 this topic을 읽었습니다. 그러나 나는 그 문제가 무엇인지 모른다.
나는 모든 조언을 주셔서 감사합니다. 시간 내 주셔서 감사합니다.
뭐라 구요? –
self.progressWindow (제어기)는 창 제어기를 보유합니다. 창 제어기는 창을 보유합니다. (기존의 이유 때문에 조금 더 복잡해졌지만 지금은 조금 복잡합니다.) 다음에 작업을 입력하면 기존 윈도우 컨트롤러를 다시 사용하게되며 기존 윈도우가 사용됩니다. 이 동작을 원하지 않으면 위임자의 속성을 nil로 설정하여 다음에 창 컨트롤러 (및 창)의 새 인스턴스가있게됩니다. –
조언 해 주셔서 감사합니다. progresswindow = nil처럼; ? 이 선은 실수로 문제를 해결했습니다. –