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]