NSOpenPanel在Objective-C中获取文件名?
问题描述:
当我创建一个NSOpenPanel,像这样:NSOpenPanel在Objective-C中获取文件名?
int i;
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setCanChooseDirectories:YES];
if ([openDlg runModalForDirectory:nil file:nil] == NSOKButton)
{
NSArray* files = [openDlg filenames];
for(i = 0; i < [files count]; i++)
{
NSString* fileName = [files objectAtIndex:i];
NSLog(fileName);
NSString *catched = fileName;
[self performSelector:@selector(decompresss2z:) withObject:catched];
}
}
当我登录fileName
,它是正确的,并打印我的文件的完整目录,但是当我试图用我的无效使用它,它就会像超级怪异字母,如ÿ^ 0f完全随机。为什么?
答
该代码没有问题。实际上,对于那些代码来说,有许多东西不太理想,但没有任何东西可以使它无法工作。什么是decompresss2z:函数看起来像什么?
如果这是我的代码,我会做如下修改:
-
runModalForDirectory:file:
被弃用;您应该使用runModal
代替。 -
filenames
已弃用;您应该使用URLs
(您可以在每个URL上调用path
以获取文件名)。 -
NSLog
的参数需要是一个格式字符串,否则奇怪的事情可能会发生。 - 您应该使用快速枚举(使用关键字
in
),而不是循环遍历具有索引的容器。它不仅效率更高,代码更少(代码更少)。 - 此处没有理由拨打
performSelector:withObject:
;只是正常调用方法。
改写,它应该是这样的:
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setCanChooseDirectories:YES];
if ([openDlg runModal] == NSOKButton) // See #1
{
for(NSURL* URL in [openDlg URLs]) // See #2, #4
{
NSLog(@"%@", [URL path]); // See #3
[self decompresss2z:[URL path]]; // See #5
}
}
此外,虽然,没有这些变化将改变您的实际问题。为了进一步提供帮助,我们需要查看更多代码。具体来说,我想看看什么样的解压缩2z:看起来像。
+0
最后更新了答案。其他地方仍然是弃用的方法。 – 2013-12-11 04:05:54
你是什么意思的“用它与我的空虚”?此外,runModalForDirectory:file:types:在10.6中折旧,您应该使用runModal。 – rdelmar 2012-08-05 16:52:47