Представление серии листов

Какао не поддерживает понятие расположения каскадом или вложенные листы. На Инструкции по Интерфейсу пользователя Apple, “когда пользователь реагирует на лист, и другой лист для того документа открывается, должен закрыться первый лист, прежде чем второй открывается”.

Подробно останавливаясь на выборке в Использовании Предупредительных Листов, рисунок 1 показывает третью кнопку, добавленную к предупредительному листу, выведенному на экран deleteSelectedRows:. Эта кнопка выводит на экран дополнительную информацию пользователю в форме пользовательского листа с дополнительной информацией.

  Лист Предупреждения рисунка 1 с тремя кнопками
Alert sheet with three buttons

Перечисление 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: метод выполняется (это было указано в файле пера при создании листа), который останавливает модальный дисплей приложения вложенного листа.

Другой пример второго листа, появляющегося как результат пользователя, нажимающего кнопку в листе, имеет лист с индикатором хода выполнения, появляются после Сохранения Как диалоговое окно.