NSToolbarDelegate Ошибка?

Я создаю NSWindowController и его окно программно. Поэтому я создаю простой NSToolbar с:

NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"PreferencesToolbar"];

[toolbar setDisplayMode:NSToolbarDisplayModeIconAndLabel];
[toolbar setAllowsUserCustomization:NO];
[toolbar setAutosavesConfiguration:NO];

[self.window setToolbar:toolbar];

[toolbar release];

Который все отлично работает, но когда я добавляю [панель инструментов setDelegate:self];

Я получаю следующую ошибку:

ОШИБКА: неверный делегат (не реализует все необходимые методы), и поэтому не может быть использован! (Для отладки добавьте точку останова в NSToolbarError

Согласно NSToolbarDelegate нет обязательных методов, так что здесь происходит не так?

2 ответа

Решение

Чтобы панель инструментов работала с вашим NSWindowController подкласс в качестве его делегата, вы должны объявить его, чтобы соответствовать NSToolbarDelegate протокол:

@interface MyController : NSWindowController <NSToolbarDelegate>

Кроме того, из документа вы должны убедиться, что некоторые из них реализованы, даже если они являются необязательными, поскольку вы создали панель инструментов программным способом. Они есть:

-(NSToolbarItem *)toolbar:(NSToolbar *)toolbar
    itemForItemIdentifier:(NSString *)itemIdentifier
willBeInsertedIntoToolbar:(BOOL)flag;

-(NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar;

-(NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar;

Важно! Хотя этот метод помечен как @optional в протоколе NSToolbarDelegate, он должен быть реализован, если соответствующая панель инструментов создана программно. Панели инструментов, созданные в Интерфейсном Разработчике, могут реализовать этот метод для расширения функциональности.

После предоставленного отличного ответа Swift- версия необходимых методов :

      func toolbar(_ toolbar: NSToolbar,
               itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier,
               willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem?
    
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier]
    
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier]
Другие вопросы по тегам