如何在beginSheetModalForWindow中获取contextInfo:completionHandler:?

时间:2017-01-31 01:41:34

标签: objective-c

我想将 -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。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

没有上下文信息,因为完成处理程序块可以简单地在周围环境中查看。

NSString* s = @"heyho";
[alert beginSheetModalForWindow:window completionHandler:^(NSModalResponse alertReturnCode) {
    if (alertReturnCode == NSAlertFirstButtonReturn)
    {
        // s is visible here
    }
 }];

换句话说,我们不需要传递上下文,因为我们上下文中。如果你有一个FileController向下传递到块中,只需让它传递到块中。