自从我上次与Cocoa玩过一年以来,似乎已经发生了很多变化。
我正在尝试运行一个打开的对话框并检索文件路径。这曾经非常简单,但现在......
代码是:
-(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 :(得分:0)
你的问题也有类似的问题: How do I make my program wait for NSOpenPanel to close?
也许
[openPanel runModal]
帮助你。它一直等到用户关闭面板
答案 1 :(得分: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;
}
做得好的Apple贬低了显而易见的容易,并以更高的复杂性取而代之。