Как создать пользовательский метод NSAlert Sheet с парадигмой обработчика завершения

Я использовал этот простой общий метод в течение некоторого времени, и он отлично работает для диалоговых окон на основе приложений, однако мне бы хотелось, чтобы такая же функциональность была в диалоговом окне стиля листа, и мне трудно собрать его вместе.

Согласно документам, насколько я их понимаю, единственный нерекомендуемый подход из 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 completeHandler: some_handler] не позволяет мне обновлять или возвращать значение в конце метода. Я знаю, почему, но есть ли способ, о котором я не думаю, чтобы это сделать.

Пожалуйста, покажите мне, как создать метод, аналогичный тому, который я использовал для листов.

Спасибо Мие


person Miek    schedule 23.04.2014    source источник


Ответы (1)


Предполагая, что код, вызывающий 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.
}];

}

Остальной код должен находиться ВНУТРИ блока завершения.

person lead_the_zeppelin    schedule 23.04.2014
comment
Хороший пример, но он не решает проблему возможности вызвать общий диалог, если код нужно поместить в блок. Я хочу вызвать тот же метод в качестве подтверждения, когда пользователь нажимает кнопку «Сохранить» или, возможно, кнопку «Удалить». Моя проблема заключается в том, чтобы завершить код в блоке, а не в возможности просто вернуть confirmFlag. Нет ли способа сделать это? - person Miek; 23.04.2014
comment
Я так не думаю. Переход от предыдущего синхронного решения к текущему асинхронному NSAlert потребует переосмысления структуры вашего кода. - person lead_the_zeppelin; 23.04.2014
comment
Я боялся этого. Хорошо. Спасибо - person Miek; 23.04.2014