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

时间:2012-08-05 10:46:10

标签: objective-c xcode 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];
    }
}

当我记录fileName时,它是正确的并且打印我的文件完整目录,但是当我尝试将它与我的虚空一起使用时,它变得像超级奇怪的字母,如ÿ^ 0f完全随机。为什么呢?

1 个答案:

答案 0 :(得分:12)

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

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

  1. runModalForDirectory:file:已弃用;你应该使用runModal代替。
  2. filenames已弃用;您应该使用URLs代替(您可以在每个网址上调用path来获取文件名)。
  3. NSLog的参数需要是一个格式字符串,否则就会发生奇怪的事情。
  4. 您应该使用快速枚举(使用in关键字),而不是使用索引循环容器。它不仅更高效,而且代码更少(代码更少)。
  5. 没有理由在此致电performSelector:withObject:;只需正常调用该方法。
  6. 重写,它看起来像这样:

    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
        }
    }   
    

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