2015-02-06 96 views
0

自從我上一次使用Cocoa已經過去了一年,似乎很多變化。從NSOpenPanel對話框獲取文件名

我想運行一個打開的對話框並檢索文件路徑。過去,這是很簡單的,但現在......

的代碼是:

-(NSString *)getFileName{ 
NSOpenPanel* panel = [NSOpenPanel openPanel]; 
__block NSString *returnedFileName; 

// This method displays the panel and returns immediately. 
// The completion handler is called when the user selects an 
// item or cancels the panel. 
[panel beginWithCompletionHandler:^(NSInteger result){ 
    if (result == NSFileHandlingPanelOKButton) { 
     NSURL* theDoc = [[panel URLs] objectAtIndex:0]; 

     // Open the document. 
     returnedFileName = [theDoc absoluteString]; 
    } 
}]; 
return returnedFileName; 
} 

-(IBAction)openAFile:(id)sender{ 

NSLog(@"openFile Pressed"); 

NSString* fileName = [self getFileName]; 

NSLog(@"The file is: %@", fileName); 
} 

(縮進已在後搞砸了,但它是正確的代碼)

我的問題是一旦打開的對話框打開,最後的NSLog語句就會被執行,並且不會等到對話框關閉。這使得fileName變量爲null,這是最終NSLog報告的內容。

這是什麼造成的?

謝謝。

回答

0

有一個類似的問題對你的: How do I make my program wait for NSOpenPanel to close?

也許

[openPanel runModal] 

幫助你。它一直等到用戶關閉面板

+0

謝謝克里斯託弗。結合一些修剪,我認爲是蘋果部分的代碼膨脹,對它進行排序。 – 2015-02-06 12:12:45

0

我一年前寫過的東西使用了runModal,所以對Christoph的建議我回到了那裏。

看來,至少在這種情況下,beginWithCompletionHandler塊是不必要的。刪除它還具有刪除使用__block標識符的必要性的優點。

以下現在工作的要求

-(NSString *)getFileName{ 
    NSOpenPanel* panel = [NSOpenPanel openPanel]; 
    NSString *returnedFileName; 

    // This method displays the panel and returns immediately. 
    // The completion handler is called when the user selects an 
    // item or cancels the panel. 

    if ([panel runModal] == NSModalResponseOK) { 
     NSURL* theDoc = [[panel URLs] objectAtIndex:0]; 

     // Open the document. 
     returnedFileName = [theDoc absoluteString]; 
    } 

return returnedFileName; 
} 

,做得很好蘋果棄用明顯,容易與增加的複雜性取代它。