NSOpenPanel在Objective-C中获取文件名?

use*_*364 1 xcode objective-c selector ziparchive

当我创建一个NSOpenPanel时,像这样:

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

当我记录fileName,它是正确的并打印我的文件完整目录,但当我尝试使用它与我的虚空,它就像超级奇怪的字母,像ÿ^ 0f完全随机.为什么?

zpa*_*ack 12

这段代码没有错.实际上,有许多事情对于该代码并不理想,但没有任何东西会使它无效.decompresss2z:function看起来像什么?

如果这是我的代码,我会做出以下更改:

  1. runModalForDirectory:file:已弃用; 你应该用runModal.
  2. filenames已弃用; 你应该使用URLs(你可以调用path每个URL来获取文件名).
  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
    }
}   
Run Code Online (Sandbox Code Playgroud)

但是,这些更改都不会改变您的实际问题.为了进一步提供帮助,我们需要查看更多代码.具体来说,我想看看decompressss2z:看起来像什么.