我想将 -beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:的所有旧用法转换为推荐的 -beginSheetModalForWindow:completionHandler:。如何定义contentInfo:并在completionhandler中获取它?
以下是旧代码的示例:
[alert beginSheetModalForWindow:window
modalDelegate:self
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
contextInfo:(void *)CFBridgingRetain(fc)];
endSelector方法如下所示:
- (void)alertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
if (returnCode == NSAlertDefaultReturn)
{
FileController *fc = (__bridge FileController *)(contextInfo);
[...]
}
}
}
我想新方法应该看起来像这样:
[alert beginSheetModalForWindow:window completionHandler:^(NSModalResponse alertReturnCode)
{
if (alertReturnCode == NSAlertFirstButtonReturn)
{
// evaluate contextInfo here ...
}
}];
但我不知道如何将contextInfo放入completionhandler。
感谢任何帮助。
答案 0 :(得分:2)
没有上下文信息,因为完成处理程序块可以简单地在周围环境中查看。
NSString* s = @"heyho";
[alert beginSheetModalForWindow:window completionHandler:^(NSModalResponse alertReturnCode) {
if (alertReturnCode == NSAlertFirstButtonReturn)
{
// s is visible here
}
}];
换句话说,我们不需要传递上下文,因为我们在上下文中。如果你有一个FileController向下传递到块中,只需让它传递到块中。