4

我正在使用 OpenPanel 来获取文件路径 URL。这有效:

[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 NSURL *pathToFile = nil;

 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];

这不会,导致“分配只读变量”错误:

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

通常,从 oPanel 的上下文中提取 pathToFile 的任何尝试都失败了。这对于小情况来说并不是什么大问题,但是随着代码的增长,我不得不将所有东西——XML 解析、核心数据等——塞进一个不合适的区域。我该怎么做才能提取 pathToFile?

谢谢。

4

2 回答 2

6

这不会,导致“分配只读变量”错误:

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

是的,因为您试图分配给pathToFile创建块时生成的变量的副本。您没有分配给pathToFile您在块外声明的原始变量。

您可以使用关键字__block块分配给此变量,但我认为这不会有帮助,因为beginSheetModalForWindow:completionHandler:不会阻塞。(文档没有提到这一点,但没有理由阻止该方法,您可以通过记录来验证它没有。)当面板仍在运行时,消息立即返回。

因此,您正在尝试将完成处理程序块分配给局部变量,但是您声明局部变量的方法可能会在时间块运行时返回,因此它将无法与块的值剩下将留在变量中。

无论您做什么,pathToFile都应该在块本身中,或者在NSURL *块可以调用的方法(带参数)中。

于 2010-02-02T06:04:03.273 回答
1

您也可以在开始工作表后运行Modal,您只需要确保稍后结束工作表即可。这样你就不必屈服于苹果的意志,它没有被弃用,它应该仍然可以完美地工作。

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:window completionHandler:nil];
NSInteger result = [openPanel runModal];
NSURL *url = nil;
if (result == NSFileHandlingPanelOKButton) 
{
    url = [openPanel URL];
}
[NSApp endSheet:openPanel];

它看起来有点像黑魔法编码,但它确实有效。

于 2012-04-05T04:06:31.180 回答