2012-08-05 60 views
1

當我創建一個NSOpenPanel,像這樣:NSOpenPanel在Objective-C中獲取文件名?

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

你是什麼意思的「用它與我的空虛」?此外,runModalForDirectory:file:types:在10.6中折舊,您應該使用runModal。 – rdelmar 2012-08-05 16:52:47

回答

12

該代碼沒有問題。實際上,對於那些代碼來說,有許多東西不太理想,但沒有任何東西可以使它無法工作。什麼是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 
    } 
} 

此外,雖然,沒有這些變化將改變您的實際問題。爲了進一步提供幫助,我們需要查看更多代碼。具體來說,我想看看什麼樣的解壓縮2z:看起來像。

+0

最後更新了答案。其他地方仍然是棄用的方法。 – 2013-12-11 04:05:54