Используя предупредительные листы

Предупредительные листы используются почти каждым приложением. Какао упрощает создавать их. Эта задача демонстрирует, как быстро добавить предупредительный лист к Вашему приложению. Посмотрите раздел Dialogs Инструкций по Интерфейсу пользователя Apple для подробных данных о том, когда должен будет использоваться лист.

Какао дает Вам два способа создать и вывести на экран предупредительные листы. Можно использовать функциональный API Набора Приложения для предупредительных листов, или можно использовать методы класса NSAlert. Последний подход рекомендуется для приложений, созданных для OS X v10.3 и позже; NSAlert не только приносит преимущества объектно-ориентированной модели, он представляет новые функции, такие как возможность вывести на экран справку, связанную с предупреждением. Этот документ объясняет оба подхода.

Используя класс NSAlert

Используя API NSAlert для отображения предупредительного листа включает три простых шага: создание и инициализация экземпляра NSAlert, отображение листа, и интерпретация и действие на выбор пользователя.

  1. Создайте объект NSAlert хотя стандартный Objective C alloc- и -init процедура. Тогда отправьте требуемые сообщения «метода set» NSAlert для инициализации предупреждения. Перечисление 1 дает пример этого.



      Создание перечисления 1 и инициализация объекта NSAlert

    NSAlert *alert = [[[NSAlert alloc] init] autorelease];
    [alert addButtonWithTitle:@"OK"];
    [alert addButtonWithTitle:@"Cancel"];
    [alert setMessageText:@"Delete the record?"];
    [alert setInformativeText:@"Deleted records cannot be restored."];
    [alert setAlertStyle:NSWarningAlertStyle];
  2. Вызовите beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo: метод на объекте NSAlert (Перечисление 2). Это выводит на экран лист, присоединенный к указанному окну.



    Перечисление 2  , Выводящее на экран предупредительный лист

    [alert beginSheetModalForWindow:[searchField window] modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil];

    Параметр модального делегата должен быть объектом, реализующим метод со следующей подписью:

    - (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode
        contextInfo:(void *)contextInfo;

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

  3. Реализуйте модальный метод делегата идентифицировать выбор пользователя и продолжиться соответственно (Перечисление 3).



    Перечисление 3  , Интерпретирующее результат в модальном методе делегата

    - (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo {
        if (returnCode == NSAlertFirstButtonReturn) {
        [self deleteRecord:currentRec];
        }
    }

    Код возврата enum постоянная идентификация кнопки на диалоговом окне, что щелкают по пользователю. Первая кнопка добавила к диалоговому окну (который, в слева направо сценариях, одно самое близкое к правому краю), идентифицируется NSAlertFirstButtonReturn. Добавляющаяся вторая кнопка появляется только налево от первого и идентифицируется NSAlertSecondButtonReturn — и т.д для третьей кнопки.

Как удобство для совместимости с более старым функциональным API (см. Используя Функциональный API), можно создать объекты NSAlert с методом фабрики классов alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:. Этот метод позволяет, Вы для сохранения более ранних констант раньше идентифицировали нажатую кнопку. Вот пример того, как Вы могли бы вызвать этот метод (с предыдущим примером в памяти):

NSAlert *alert = [NSAlert alertWithMessageText:@"Delete the record?"
    defaultButton:@"OK" alternateButton:@"Cancel" otherButton:nil
    informativeTextWithFormat:@"Deleted records cannot be restored."];

Используя функциональный API

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

NSBeginAlertSheet имеет довольно длинный список параметров, но функцию не трудно использовать. Вот сводка параметров:

заголовок

Основной текст предупреждения, появляющегося в подчеркнутом системном шрифте.

defaultButton

Метка для кнопки листа по умолчанию; название кнопки должно соответствовать действию, которое будет следовать из нажатия кнопки например, «Сохранять», «Стирание», или «Удалять».

alternateButton

Метка для альтернативной кнопки листа. Если Вы передаете nil, только defaultButton выведен на экран.

otherButton

Метка для другой кнопки листа. Если Вы передаете nil, только defaultButton и alternateButton выведены на экран.

documentWindow

Ссылка на NSWindow лист присоединена.

modalDelegate

Ссылка на объект, действующий как делегат листа.

didEndSelector

Селектор для метода реализован modalDelegate. Этот метод отправляется, когда модальный сеанс заканчивается, но прежде чем отклонен лист. Если Вам не нужна эта возможность, передача NULL.

didDismissSelector

Селектор для метода реализован modalDelegate. Этот метод отправляется после того, как лист отклонен в конечном счете, Ваше приложение, возможно, должно было бы выполнить дополнительную обработку. Если Вам не нужна эта возможность, передача NULL.

contextInfo

Дополнительная информация можно определить для передачи modalDelegate как параметр didEndSelector и didDismissSelector.

сообщение

Дополнительный дополнительный текст, появляющийся в листе. Текст появляется в маленьком системном шрифте. Эта строка может содержать printf- разработайте escape-последовательности.

optionalParameters

printf- параметры стиля раньше форматировали сообщение.

Так, реализация deleteSelectedRows: просто посмотрел бы как показано в Перечислении 4.

Перечисление 4  deleteSelectedRows: метод, реализованный для подарить листу две кнопки

- (BOOL)deleteSelectedRows: (NSWindow *)sender
{
    NSBeginAlertSheet(
        @"Do you really want to delete the selected rows?",
                                // sheet message
        @"Delete",              // default button label
        nil,                    // no third button
        @"Cancel",              // other button label
        sender,                 // window sheet is attached to
        self,                   // we’ll be our own delegate
        @selector(sheetDidEndShouldDelete:returnCode:contextInfo:),
                                // did-end selector
        NULL,                   // no need for did-dismiss selector
        sender,                 // context info
        @"There is no undo for this operation.");
                                // additional text
 
// We don’t know if the rows should be deleted until the user responds,
// so don’t.
 
    return NO;
}

Когда пользователь пытается удалить выбранные расходы, лист, показанный на рисунке 1, раскрывается от панели заголовка окна.

  Предупреждение рисунка 1 для подтверждения удаляет
Alert to confirm deletes

Реализация селектора-конца sheetDidEndShouldDelete:returnCode:contextInfo:, отправленный то, когда пользователь нажимает кнопку, следующие:

- (void)sheetDidEndShouldDelete: (NSWindow *)sheet
        returnCode: (NSInteger)returnCode
        contextInfo: (void *)contextInfo
{
    if (returnCode == NSAlertDefaultReturn)
    // delete selected rows here
}

Если пользователь щелкает по Кнопке отмены, значение кода возврата NSAlertOtherReturn. Если бы третья кнопка была предоставлена, то ее возвращаемое значение было бы NSAlertAlternateReturn.