Настройка предупредительных диалоговых окон

Начало с OS X v10.5 (Leopard), NSAlert включает методы для отображения и управления представлениями аксессуара и управления флажком утаивания. Следующие разделы описывают, как использовать эти функции.

Управление представлениями аксессуара

Предупреждение может иметь вспомогательное представление, представление, содержащее средства управления и возможно другие объекты, связанные с предупреждением. Например, предупреждение могло предупредить пользователя, что файл, который они копируют, заменит существующий файл того же имени; это могло бы иметь флажок для вспомогательного представление, если проверено, приводящее к приложению, сохранившему существующий файл под немного отличающимся именем (например, путем добавления «_save» к имени файла).

Вы устанавливаете представление аксессуара предупредительного диалогового окна с помощью setAccessoryView: метод. Можно создать представление программно, но больше общего подхода должно составить представление в Интерфейсном Разработчике. В заголовочном файле для пользовательского класса объявите выход для вспомогательного представление, и затем соедините этот выход в Интерфейсном Разработчике. По умолчанию, NSAlert располагает вспомогательное представление ниже информативного текста предупреждения и кнопки утаивания (если таковые имеются) и выше предупредительных кнопок, выровненных по левому краю с информативным текстом.

Перечисление 1 иллюстрирует, как вывести на экран предупредительное диалоговое окно, имеющее и вспомогательное представление и кнопку утаивания, и как обработать ответ пользователя в обоих случаях. Комментарии вызывают строки, которые особенно интересны для одного или другой функции. (Можно узнать о кнопках утаивания в Управлении Кнопкой Утаивания.)

Перечисление 1  , Выводящее на экран предупреждение со вспомогательным представление и кнопка утаивания

static BOOL runAgain = YES; // Suppression button: static var holds current value of suppression button
 
- (void)showRecordDeleteAlert:(id)sender {
    if (runAgain == NO) // Suppression button: if user doesn't want to see alert, return
        return;
    NSAlert *alert = [[NSAlert alloc] init];
    [alert addButtonWithTitle:@"Delete"];
    [alert addButtonWithTitle:@"Extend"];
    [alert setMessageText:@"Delete the record?"];
    [alert setInformativeText:@"Deleted records cannot be restored.
           You may extend the valid-until date if you wish."];
    [alert setAlertStyle:NSWarningAlertStyle];
    [alert setShowsSuppressionButton:YES]; // Suppression button: show it
    [alert setAccessoryView:myView];  // Accessory view: "my" accessed via an outlet connection
    NSInteger result = [alert runModal];
 
    if ( result == NSAlertFirstButtonReturn ) {
        // "Delete" clicked
        [self deleteRecord:currentRec];
 
    } else if ( result == NSAlertSecondButtonReturn ) {  // Accessory view: handle user-specified data
        // "Extend" clicked
        NSDate *chosenDate = [myDatePicker dateValue];
        if ([chosenDate laterDate:[NSDate date]] == chosenDate) {
            [self setValidDate:chosenDate ofRecord:currentRec];
        }
    }
    runAgain = (BOOL)![[alert suppressionButton] state]; // Suppression button: get state of button
    [alert release];
}

Если Вы хотите настроить расположение вспомогательного представление, сначала вызовите layout и затем сделайте любое специальное расположение и калибровку вспомогательного представление до выполнения предупреждения. Эта последовательность переопределяет поведение по умолчанию где NSAlert лениво размечает вспомогательное представление прежде, чем показать панель. Необходимо вызвать layout только после того, как Вы закончили конфигурировать предупреждение с сообщением, информативным текстом, кнопками, и при желании кнопкой утаивания. Если Вы делаете какие-либо пользовательские макеты, советуются, что расположение по умолчанию предупреждения могло измениться в будущих выпусках.

Управление кнопкой утаивания

Предупредительные диалоговые окна могут включать кнопку утаивания, которая является флажком с заголовком по умолчанию (локализованным), “Не показывают это сообщение снова”. (Флажок является типом кнопки.), Если пользователь устанавливает флажок, приложение не должно отображать предупреждение снова во время текущего сеанса приложения. Кнопка утаивания является функцией, предназначенной для улучшения пользовательского опыта, позволяя приложению подавить предупреждения об относительно тривиальных вопросах. Приложение ответственно за определение, должно ли предупреждение быть выведено на экран на основе выбора пользователя; другими словами, утаивание не происходит автоматически.

Вы добавляете кнопку утаивания к предупредительному диалоговому окну путем отправки NSAlert объект a setShowsSuppressionButton: сообщение с параметром YES. Прежде, чем выполнить предупредительное диалоговое окно, можно выбрать кнопку утаивания путем вызова suppressionButton и настройте кнопку определенными способами. Например, Вы могли настроить заголовок по умолчанию с помощью следующего вложенного выражения сообщения:

[[alert suppressionButton] setTitle:@"My new button title."];

Можно также вызвать suppressionButton и затем набор начальное состояние кнопки или выборки ее текущее состояние с помощью setState: и state методы NSButton. После того, как предупреждение отклонено, Вы используете последний метод, чтобы определить, проверил ли пользователь флажок утаивания. Пример кода в Перечислении 1 иллюстрирует простой путь — т.е. использование статической переменной — для записи значения кнопки утаивания и более поздней проверки это прежде, чем выполнить предупредительное диалоговое окно снова. Однако более полезный подход мог бы быть должен сохранить состояние кнопки утаивания в пользовательских значениях по умолчанию и более поздней проверке это прежде, чем показать предупреждение снова.

По умолчанию кнопка утаивания расположена ниже информативного текста и выше вспомогательного представление (если таковые имеются) и предупредительные кнопки; это выравнивается по левому краю с информативным текстом. Однако, не рассчитывайте на размещение этой кнопки, так как это могло бы измениться в будущем. При необходимости во флажке в целях кроме предупредительного утаивания рекомендуется создать вспомогательное представление т.е. или содержит, флажок.