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