我正在使用 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?

谢谢。

最佳答案



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

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

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

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

关于cocoa - 从 beginSheetModalForWindow 获取 URL :,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2182092/

10-09 01:49