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

ただし、これらの変更によって実際の問題が変わることはありません。さらに支援するには、より多くのコードを確認する必要があります。具体的には、decompressss2z: がどのように見えるかを確認したいと思います。

于 2012-08-13T03:15:08.890 に答える