如何使用Completion Handler范例创建自定义NSAlert工作表方法

时间:2014-04-23 17:36:41

标签: objective-c objective-c-blocks nsalert

我已经将这个简单的通用方法用于了一段时间,它适用于基于应用程序的对话框,但是我希望在工作表样式对话框中使用相同的功能,而且我很难将它们组合在一起。

根据我理解的文档,OS10.9及更高版本中唯一不被弃用的方法是将NSAlert类与完成处理程序进程一起使用。似乎几乎不可能从通用方法中返回Bool。

我的代码:

-(BOOL)confirm :(NSString*)questionTitle withMoreInfo:(NSString*)addInfo andTheActionButtonTitle:(NSString*)actionType{
    BOOL confirmFlag = NO;

    NSAlert *alert = [NSAlert alertWithMessageText: questionTitle
                                 defaultButton:actionType
                               alternateButton:@"Cancel"
                                   otherButton:nil
                     informativeTextWithFormat:@"%@",addInfo];
    [alert setAlertStyle:1];

    NSInteger button = [alert runModal];

    if(button == NSAlertDefaultReturn){
        confirmFlag = YES;

     }else{

        confirmFlag = NO;
     }

     return confirmFlag;

 }


 The [alert runModal] returns the value I can return.

使用较新的范例,[alert beginSheetModalForWindow:[self window] sheetWindow completionHandler:some_handler]不允许我更新或返回方法结尾的值。我知道为什么,但是有一种方法我不想做到这一点。

请告诉我如何创建一个类似于我用于表格的方法。

由于 三重

1 个答案:

答案 0 :(得分:6)

假设调用confirm:withMoreInfo:andTheActionButtonTitle:的代码是从validate调用的。

-(void)validate
{
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:questionTitle];
// fill out NSAlert

[alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {
    if(returnCode == NSModalResponseStop)
    {
        confirmFlag = YES;
    }
    else
    {
        confirmFlag = NO;
    }
//Rest of your code goes in here.
}];

}

其余代码需要 INSIDE 完成块。