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

NSOpenPanel是否在Objective-C中获取文件名?,objective-c,xcode,selector,ziparchive,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 fil

当我创建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];
    }
}
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
    }
}   
inti;
NSOpenPanel*openDlg=[NSOpenPanel-openPanel];
[openDlg setCanChooseFiles:是];
[openDlg SetCanChoosedDirectories:是];
if([openDlg runModalForDirectory:nil file:nil]==NSOKButton)
{
NSArray*文件=[openDlg文件名];
对于(i=0;i<[文件计数];i++)
{
NSString*fileName=[files objectAtIndex:i];
NSLog(文件名);
NSString*catched=文件名;
[自执行选择器:@selector(decompresss2z:)with object:catched];
}
}

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

这段代码没有问题。事实上,该代码有很多地方不太理想,但没有什么能让它不工作。解压s2z:函数看起来像什么

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

  • runModalForDirectory:file:
    已弃用;您应该改用
    runModal
  • 文件名
    已弃用;您应该改用
    URL
    (您可以对每个URL调用
    path
    ,以获取文件名)
  • NSLog
    的参数必须是格式字符串,否则可能会发生奇怪的事情
  • 您应该使用快速枚举(在关键字中使用
    ),而不是在带有索引的容器中循环。它不仅效率更高,而且代码更少(代码越少越好)
  • 没有理由在此处调用
    性能选择器:withObject:
    ;只需正常调用该方法
  • 重写后,它将如下所示:

    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];
        }
    }
    
    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:是什么样子。

    这段代码没有什么问题。事实上,该代码有很多地方不太理想,但没有什么能让它不工作。解压s2z:函数看起来像什么

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

  • runModalForDirectory:file:
    已弃用;您应该改用
    runModal
  • 文件名
    已弃用;您应该改用
    URL
    (您可以对每个URL调用
    path
    ,以获取文件名)
  • NSLog
    的参数必须是格式字符串,否则可能会发生奇怪的事情
  • 您应该使用快速枚举(在关键字中使用
    ),而不是在带有索引的容器中循环。它不仅效率更高,而且代码更少(代码越少越好)
  • 没有理由在此处调用
    性能选择器:withObject:
    ;只需正常调用该方法
  • 重写后,它将如下所示:

    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];
        }
    }
    
    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:是什么样子。

    你说的“将它用于我的void”是什么意思?此外,runModalForDirectory:file:types:在10.6中被折旧,您应该改用runModal。您所说的“与我的void一起使用”是什么意思?此外,runModalForDirectory:file:types:在10.6中被折旧,您应该改用runModal。每隔一个地方仍然是不推荐的方法。最后更新了答案。每隔一个地方仍然是不推荐的方法。