爲什麼下面的代碼有效?這是一個小型的Cocoa程序,它使用NSOpenPanel選擇一個文件並在Emacs.app中打開它。它可以從起始目錄作爲參數在命令行中運行。Cocoa GUI類如何在不調用NSApplication或NSRunLoop的情況下運行
NSOpenPanel如何在不調用NSApplication或NSRunLoop的情況下運行?對於沒有明確啓動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"];
}
}
是的,我明白了。感謝您的快速響應。我剛剛意識到的一件事是,舊的經典Apple main.m調用[NSApplication sharedApplication],而不是[NSApplication alloc]。我猜測對runModalForWindow的調用可能已經在Apple庫中實例化了一個單例[NSApplication sharedApplication]。 – Colin