다음 코드가 작동하는 이유는 무엇입니까? NSOpenPanel을 사용하여 파일을 선택하고 Emacs.app에서 열어 보는 작은 코코아 프로그램입니다. 시작 디렉토리를 인수로하여 명령 행에서 실행할 수 있습니다.NSApplication 또는 NSRunLoop 호출없이 Cocoa GUI 클래스가 실행되는 방식
NSApplication 또는 NSRunLoop을 호출하지 않고 NSOpenPanel을 실행하는 방법은 무엇입니까? NSApplication 또는 NSRunLoop을 명시 적으로 시작하지 않는 Cocoa 프로그램의 제한 사항은 무엇입니까? 나는 그 중 하나가 있다고 생각했을 것이다. 어떤 종류의 GUI도 사용할 수 없다. 아마도 NSOpenPanel을 호출하면 NSRunLoop을 호출하는 대체 코드가 호출됩니다. 나는 [NSApplication alloc] 및 + [NSRunLoop alloc]에 중단 점을 넣었지만 트리거되지 않았습니다.
main.m:
#import <Cocoa/Cocoa.h>
NSString *selectFileWithStartPath(NSString *path) {
NSString *answer = nil;
NSOpenPanel* panel = [NSOpenPanel openPanel];
panel.allowsMultipleSelection = NO;
panel.canChooseFiles = YES;
panel.canChooseDirectories = NO;
panel.resolvesAliases = YES;
if([panel runModalForDirectory:path file:nil] == NSOKButton)
answer = [[[panel URLs] objectAtIndex:0] path];
return answer;
}
int main(int argc, const char * argv[]) {
NSString *startPath = argc > 1 ? [NSString stringWithUTF8String:argv[1]] : @"/Users/Me/Docs";
printf("%s\n", argv[1]);
BOOL isDir;
if([[NSFileManager defaultManager] fileExistsAtPath:startPath isDirectory:&isDir] && isDir) {
system([[NSString stringWithFormat:@"find %@ -name \\*~ -exec rm {} \\;", startPath] UTF8String]);
NSString *file = selectFileWithStartPath(startPath);
if(file) [[NSWorkspace sharedWorkspace] openFile:file withApplication:@"Emacs.app"];
}
}
예, 알 수 있습니다. 빠른 응답에 감사드립니다. 방금 깨달은 한가지는 오래된 고전적인 main.m이 [NSApplication alloc]이 아니라 [NSApplication sharedApplication]을 호출한다는 것입니다. runModalForWindow에 대한 호출이 Apple 라이브러리에서 싱글 톤 [NSApplication sharedApplication]을 인스턴스화하여 앞당겨 졌을 것으로 추측합니다. – Colin