为什么以下代码有效?这是一个使用 NSOpenPanel 选择文件并在 Emacs.app 中打开的小型 Cocoa 程序。它可以从命令行以起始目录作为参数运行。
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"];
}
}