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完全随机。为什么?

+1

你是什么意思的“用它与我的空虚”?此外,runModalForDirectory:file:types:在10.6中折旧,您应该使用runModal。 – rdelmar 2012-08-05 16:52:47

该代码没有问题。实际上,对于那些代码来说,有许多东西不太理想,但没有任何东西可以使它无法工作。什么是decompresss2z:函数看起来像什么?

如果这是我的代码,我会做如下修改:

  1. runModalForDirectory:file:被弃用;您应该使用runModal代替。
  2. filenames已弃用;您应该使用URLs(您可以在每个URL上调用path以获取文件名)。
  3. NSLog的参数需要是一个格式字符串,否则奇怪的事情可能会发生。
  4. 您应该使用快速枚举(使用关键字in),而不是循环遍历具有索引的容器。它不仅效率更高,代码更少(代码更少)。
  5. 此处没有理由拨打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