1

当我创建一个 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,它是正确的并打印我的文件完整目录,但是当我尝试将它与我的 void 一起使用时,它变得像超级奇怪的字母,就像 ÿ^0f 完全随机。为什么?

4

1 回答 1

13

该代码没有任何问题。实际上,该代码有许多不理想的地方,但没有什么会使其无法正常工作。decompresss2z: 函数是什么样的?

如果这是我的代码,我会进行以下更改:

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

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

于 2012-08-13T03:15:08.890 回答