Добавление и удаление элементов панели инструментов

Делегат экземпляра NSToolbar ответственен за обеспечение идентификаторов, указывающих элементы панели инструментов, позволяющиеся на панели инструментов, а также элементах по умолчанию, видимых на новой панели инструментов.

Позволенный и элементы панели инструментов по умолчанию

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

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

  Пример перечисления 1 toolbarAllowedItemIdentifiers: реализация метода

- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar {
    return [NSArray arrayWithObjects: SaveDocToolbarItemIdentifier,
        NSToolbarPrintItemIdentifier,
        NSToolbarShowColorsItemIdentifier,
        NSToolbarShowFontsItemIdentifier,
        NSToolbarCustomizeToolbarItemIdentifier,
        NSToolbarFlexibleSpaceItemIdentifier,
        NSToolbarSpaceItemIdentifier,
        NSToolbarSeparatorItemIdentifier, nil];
}
  Конфигурация элемента панели инструментов Example рисунка 1
Example toolbar item configuration

Набор по умолчанию элементов панели инструментов возвращается путем реализации требуемого метода toolbarDefaultItemIdentifiers:. Реализация, как ожидают, возвратит массив идентификаторов, содержащих элементы указанной панели инструментов по умолчанию. Если во время инициализации панели инструментов никакие переопределяющие значения не найдены в пользовательских значениях по умолчанию (тем, что вызвал setAutosavesConfiguration: с YES как параметр), эти элементы используются в качестве набора по умолчанию для панели инструментов. Кроме того, если пользователь принимает решение вернуться к элементам панели инструментов по умолчанию набор, возвращенный toolbarDefaultItemIdentifiers: будет использоваться.

Пример кода в Перечислении 2 заставляет элементы по умолчанию быть сконфигурированными как показано на рисунке 2.

  Пример перечисления 2 toolbarDefaultItemIdentifiers: реализация метода

- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar {
    return [NSArray arrayWithObjects: SaveDocToolbarItemIdentifier,
        NSToolbarPrintItemIdentifier,
        NSToolbarSeparatorItemIdentifier,
        NSToolbarShowColorsItemIdentifier,
        NSToolbarShowFontsItemIdentifier,
        NSToolbarFlexibleSpaceItemIdentifier,
        NSToolbarSpaceItemIdentifier,
        SearchDocToolbarItemIdentifier, nil];
}
  Конфигурация элементов панели инструментов Example рисунка 2
Example toolbar items configuration

Создание новых элементов панели инструментов, когда требуется

Реализация требуемого метода toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar: возвращает экземпляр NSToolbarItem, как указано идентификатором элемента панели инструментов. Элемент не может быть сразу добавлен к панели инструментов, как этот метод также вызывают, когда создается лист настройки.

Пример кода в Перечислении 3 создает простой экземпляр NSToolbarItem для пользовательского элемента панели инструментов приложения, SaveDocToolbarItemIdentifier. Этот элемент появляется как значок на панели инструментов с помощью рендеринга NSToolbarItem по умолчанию.

Перечисление 3 A  toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar: реализация метода для создания простого экземпляра NSToolbarItem

- (NSToolbarItem *) toolbar:(NSToolbar *)toolbar
      itemForItemIdentifier:(NSString *)itemIdentifier
  willBeInsertedIntoToolbar:(BOOL)flag
{
    NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];
 
    if ([itemIdentifier isEqual: SaveDocToolbarItemIdentifier]) {
    // Set the text label to be displayed in the
    // toolbar and customization palette
    [toolbarItem setLabel:@"Save"];
    [toolbarItem setPaletteLabel:@"Save"];
 
    // Set up a reasonable tooltip, and image
    // you will likely want to localize many of the item's properties
    [toolbarItem setToolTip:@"Save Your Document"];
    [toolbarItem setImage:[NSImage imageNamed:@"SaveDocumentItemImage"]];
 
    // Tell the item what message to send when it is clicked
    [toolbarItem setTarget:self];
    [toolbarItem setAction:@selector(saveDocument:)];
    } else  {
    // itemIdentifier referred to a toolbar item that is not
    // provided or supported by us or Cocoa
    // Returning nil will inform the toolbar
    // that this kind of item is not supported
    toolbarItem = nil;
    }
    return toolbarItem;
}

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

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

Пример кода в Перечислении 4 реализует поисковый элемент панели инструментов как показано на рисунке 1.

Перечисление 4 A  toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar: реализация метода для создания представления - базировала экземпляр NSToolbarItem

- (NSToolbarItem *) toolbar:(NSToolbar *)toolbar
      itemForItemIdentifier:(NSString *)itemIdentifier
  willBeInsertedIntoToolbar:(BOOL)flag
{
    NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier] autorelease];
 
    if ([itemIdentifier isEqual: SearchDocToolbarItemIdentifier]) {
    // Set up the standard properties
    [toolbarItem setLabel:@"Search"];
    [toolbarItem setPaletteLabel:@"Search"];
    [toolbarItem setToolTip:@"Search Your Document"];
 
    // Use a custom view, a rounded text field,
    // attached to searchFieldOutlet in InterfaceBuilder as
    // the custom view
    [toolbarItem setView:searchFieldOutlet];
    [toolbarItem setMinSize:NSMakeSize(100,NSHeight([searchFieldOutlet frame]))];
    [toolbarItem setMaxSize:NSMakeSize(400,NSHeight([searchFieldOutlet frame]))];
 
    // Create the custom menu
    NSMenu *submenu=[[[NSMenu alloc] init] autorelease];
    NSMenuItem *submenuItem=[[[NSMenuItem alloc] initWithTitle: @"Search Panel"
            action:@selector(searchUsingSearchPanel:)
            keyEquivalent: @""] autorelease];
    NSMenuItem *menuFormRep=[[[NSMenuItem alloc] init] autorelease];
 
    [submenu addItem: submenuItem];
    [submenuItem setTarget:self];
    [menuFormRep setSubmenu:submenu];
    [menuFormRep setTitle:[toolbarItem label]];
    [toolbarItem setMenuFormRepresentation:menuFormRep];
    } else {
    // itemIdentifier referred to a toolbar item that is not
    // not provided or supported by us or cocoa
    // Returning nil will inform the toolbar
    // this kind of item is not supported
    toolbarItem = nil;
    }
    return toolbarItem;
}

Программно вставляя и удаляя элементы панели инструментов

В то время как при большинстве обстоятельств пользователь добавит и удалит элементы из панели инструментов с помощью листа настройки или контекстного меню, возможно вставить и удалить элементы программно.

Метод insertItemWithItemIdentifier:atIndex: вставляет элемент, указанный идентификатором элемента в указанном индексе.

Метод removeItemAtIndex: удаляет элемент панели инструментов в указанном индексе.

Быть уведомленным, когда элементы добавлены или удалены из панели инструментов

NSToolbar когда элементы панели инструментов были добавлены или удалены из панели инструментов, делегат может дополнительно быть уведомлен.

Дополнительный метод делегата toolbarWillAddItem: обеспечивает уведомление, что элемент панели инструментов собирается быть добавленным к панели инструментов. Идентификатор для элемента панели инструментов содержится в userInfo словаре уведомления под ключом @"item". Типичное использование для этого метода должно поставить цель для стандартного элемента панели инструментов, такого как Печать, и возможно изменить другие атрибуты элемента, такие как его подсказка.

Пример кода в Перечислении 5 ставит цель и действие для стандартного элемента панели инструментов Print, когда делегат уведомляется, что элемент будет добавлен к панели инструментов.

Перечисление 5  реализация toolbarWillAddItem: метод для конфигурирования NSToolbarItem, прежде чем это будет добавлено к панели инструментов

- (void) toolbarWillAddItem:(NSNotification *)notification {
    NSToolbarItem *addedItem = [[notification userInfo] objectForKey: @"item"];
    if ([[addedItem itemIdentifier] isEqual: NSToolbarPrintItemIdentifier]) {
    [addedItem setToolTip:@"Print Your Document"];
    [addedItem setTarget:self];
    [addedItem setAction:@selector(myCustomPrintAction:)];
    }
}

Дополнительный метод делегата toolbarDidRemoveItem: обеспечивает уведомление, что панель инструментов удалила элемент панели инструментов из панели инструментов. Идентификатор для элемента панели инструментов содержится в userInfo словаре уведомления под ключом @"item". Вы могли использовать эту возможность сообщить контроллеру окна, что данные, связанные с этим элементом, больше не действительны.

Когда поисковый элемент удален из панели инструментов, пример в Перечислении 6 лишает законной силы строку поиска приложения.

Перечисление 6  реализация toolbarDidRemoveItem: метод, лишающий законной силы значение, когда элемент панели инструментов удален из панели инструментов.

- (void)toolbarDidRemoveItem:(NSNotification *)notification {
    NSToolbarItem *removedItem = [[notification userInfo] objectForKey: @"item"];
    if ([removedItem itemIdentifier] isEqual:SearchDocToolbarItemIdentifier) {
    [self invalidateSearchString];
    }
}

Объекты кроме делегата панели инструментов могут отследить добавление и удаление элементов панели инструментов путем регистрации для NSToolbarWillAddItemNotification и NSToolbarDidRemoveItemNotification уведомления явно.