Используя предупредительные листы
Предупредительные листы используются почти каждым приложением. Какао упрощает создавать их. Эта задача демонстрирует, как быстро добавить предупредительный лист к Вашему приложению. Посмотрите раздел Dialogs Инструкций по Интерфейсу пользователя Apple для подробных данных о том, когда должен будет использоваться лист.
Какао дает Вам два способа создать и вывести на экран предупредительные листы. Можно использовать функциональный API Набора Приложения для предупредительных листов, или можно использовать методы класса NSAlert. Последний подход рекомендуется для приложений, созданных для OS X v10.3 и позже; NSAlert не только приносит преимущества объектно-ориентированной модели, он представляет новые функции, такие как возможность вывести на экран справку, связанную с предупреждением. Этот документ объясняет оба подхода.
Используя класс NSAlert
Используя API NSAlert для отображения предупредительного листа включает три простых шага: создание и инициализация экземпляра NSAlert, отображение листа, и интерпретация и действие на выбор пользователя.
Создайте объект 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];
Вызовите
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 , Интерпретирующее результат в модальном методе делегата
- (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
имеет довольно длинный список параметров, но функцию не трудно использовать. Вот сводка параметров:
Основной текст предупреждения, появляющегося в подчеркнутом системном шрифте.
Метка для кнопки листа по умолчанию; название кнопки должно соответствовать действию, которое будет следовать из нажатия кнопки например, «Сохранять», «Стирание», или «Удалять».
Метка для альтернативной кнопки листа. Если Вы передаете
nil
, только defaultButton выведен на экран.Метка для другой кнопки листа. Если Вы передаете
nil
, только defaultButton и alternateButton выведены на экран.Ссылка на NSWindow лист присоединена.
Ссылка на объект, действующий как делегат листа.
Селектор для метода реализован modalDelegate. Этот метод отправляется, когда модальный сеанс заканчивается, но прежде чем отклонен лист. Если Вам не нужна эта возможность, передача
NULL
.Селектор для метода реализован modalDelegate. Этот метод отправляется после того, как лист отклонен в конечном счете, Ваше приложение, возможно, должно было бы выполнить дополнительную обработку. Если Вам не нужна эта возможность, передача
NULL
.Дополнительная информация можно определить для передачи modalDelegate как параметр didEndSelector и didDismissSelector.
Дополнительный дополнительный текст, появляющийся в листе. Текст появляется в маленьком системном шрифте. Эта строка может содержать
printf
- разработайте escape-последовательности.printf
- параметры стиля раньше форматировали сообщение.
- заголовок
- defaultButton
- alternateButton
- otherButton
- documentWindow
- modalDelegate
- didEndSelector
- didDismissSelector
- contextInfo
- сообщение
- optionalParameters
Так, реализация 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, раскрывается от панели заголовка окна.
Реализация селектора-конца sheetDidEndShouldDelete:returnCode:contextInfo:
, отправленный то, когда пользователь нажимает кнопку, следующие:
- (void)sheetDidEndShouldDelete: (NSWindow *)sheet |
returnCode: (NSInteger)returnCode |
contextInfo: (void *)contextInfo |
{ |
if (returnCode == NSAlertDefaultReturn) |
// delete selected rows here |
} |
Если пользователь щелкает по Кнопке отмены, значение кода возврата NSAlertOtherReturn
. Если бы третья кнопка была предоставлена, то ее возвращаемое значение было бы NSAlertAlternateReturn
.