Представление серии листов
Какао не поддерживает понятие расположения каскадом или вложенные листы. На Инструкции по Интерфейсу пользователя Apple, “когда пользователь реагирует на лист, и другой лист для того документа открывается, должен закрыться первый лист, прежде чем второй открывается”.
Подробно останавливаясь на выборке в Использовании Предупредительных Листов, рисунок 1 показывает третью кнопку, добавленную к предупредительному листу, выведенному на экран deleteSelectedRows:
. Эта кнопка выводит на экран дополнительную информацию пользователю в форме пользовательского листа с дополнительной информацией.
Перечисление 1 показывает реализацию метода, создающего это предупреждение.
Перечисление 1 deleteSelectedRows: метод, реализованный для подарить листу три кнопки
- (BOOL)deleteSelectedRows: (NSWindow *)sender |
{ |
NSBeginAlertSheet( |
@"Do you really want to delete the selected information?", |
// sheet message |
@"Delete", // default button label |
@"More Info", // allow user to check on the delete |
@"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 in sheet |
nil); // no parameters in message |
// We don’t know if the rows should be deleted until the user responds, |
// so don’t. |
return NO; |
} |
Селектор-конца обновляется для обработки пользователя, запрашивающего дополнительную информацию. Если пользователь запрашивает информацию, предупредительный лист закрывается до представления пользовательского листа:
- (void)sheetDidEndShouldClose: (NSWindow *)sheet |
returnCode: (NSInteger)returnCode |
contextInfo: (void *)contextInfo |
{ |
if (returnCode == NSAlertAlternateReturn) { |
[sheet close]; |
[self showMoreInfo: (NSWindow *)contextInfo]; |
} |
if (returnCode == NSAlertDefaultReturn) |
// delete selected rows here |
} |
Создание и дисплей пользовательских листов обсуждены в Использовании Пользовательских Листов.
В отдельном пере определяются окно с объяснительным текстом и кнопка Close. Кнопка Close установлена выполнить showMoreInfo:
метод, когда щелкнувшийся. Реализация showMoreInfo:
метод совпал бы с showCustomSheet:
метод, показанный в Перечислении 1.
Перечисление 2 , Выводящее на экран пользовательский лист
- (void)showMoreInfo: (NSWindow *)window |
// User has asked for more information about the delete. Display it. |
{ |
if (!moreInfoSheet) |
[NSBundle loadNibNamed: @"DeleteExpenseInfo" owner: self]; |
[NSApp beginSheet: moreInfoSheet |
modalForWindow: window |
modalDelegate: nil |
didEndSelector: nil |
contextInfo: nil]; |
[NSApp runModalForWindow: moreInfoSheet]; |
// Sheet is up here. |
[NSApp endSheet: moreInfoSheet]; |
[moreInfoSheet orderOut: self]; |
} |
Когда пользователь нажимает кнопку Close, showMoreInfo:
метод выполняется (это было указано в файле пера при создании листа), который останавливает модальный дисплей приложения вложенного листа.
Другой пример второго листа, появляющегося как результат пользователя, нажимающего кнопку в листе, имеет лист с индикатором хода выполнения, появляются после Сохранения Как диалоговое окно.