NSOpenPanel URL 到字符串

Posted

技术标签:

【中文标题】NSOpenPanel URL 到字符串【英文标题】:NSOpenPanel URL to string 【发布时间】:2011-10-23 15:30:46 【问题描述】:

我用下面的代码打开了一个文件

    NSOpenPanel * panel = [NSOpenPanel openPanel];
            [panel setCanSelectHiddenExtension:YES];
            [panel setRequiredFileType:@"scpt"];
            [panel setAllowsOtherFileTypes:NO];

            [panel
             beginSheetForDirectory:nil
             file:@"Script"
             modalForWindow:[self window]
             modalDelegate:self
             didEndSelector:@selector (openFileDidEnd:returnCode:contextInfo:)
             contextInfo:nil];

-(void)openFileDidEnd:(NSSavePanel*)panel returnCode:(int)returnCode contextInfo:(void*)contextInfo



if(returnCode == NSOKButton)


    NSString *s=[[panel URL] absoluteString];
    [NSThread detachNewThreadSelector:@selector(setFileString:) toTarget:self withObject:s ];


;

s 值为 'file://home/Users/myName/Desktop/1.scpt'

如果我打电话

bool b=[[NSFileManager defaultManager] fileExistsAtPath:@"file://home/Users/myName/Desktop/1.scpt"];

检查路径为s的文件是否存在,总是返回0

但如果我检查了 Finder,我发现它的路径是 '/Users/myName/Desktop/1.scpt'

bool b=[[NSFileManager defaultManager] fileExistsAtPath:@"/Users/myName/Desktop/1.scpt"];

将返回 YES!

如何从 NSOpenPanel 的 url 中获取正确的字符串路径?

欢迎评论

【问题讨论】:

【参考方案1】:
NSString *s=[[panel URL] absoluteString];

应该是

NSString *s=[[panel URL] path];

如果您的目标是 Sn​​ow Leopard 或更高版本,我建议您使用

- (void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(NSInteger result))handler

由于您使用的方法已弃用,因此使用块要容易得多。

【讨论】:

为了澄清问题,URL 使用 URL 的字符串表示形式响应 absoluteString。这不是路径名,不能与需要路径名的 fileExistsAtPath: 等方法一起使用。要获取 URL 的路径名,您需要向它询问其path

以上是关于NSOpenPanel URL 到字符串的主要内容,如果未能解决你的问题,请参考以下文章

NSOpenPanel - 排除启动盘

NSOpenPanel 和检测到泄露的观察者

使用 Xcode 4.5.1 调试时 NSOpenPanel 崩溃

NSOpenPanel 使用详解

如何通过NSOpenPanel打开具有新文件夹功能的面板?

NSOpenPanel-Object C组件-打开对话框-选择文件/文件夹获得路径