Im正在用程序创建NSWindowController及其窗口。所以我用创建了一个简单的NSToolbar
NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"PreferencesToolbar"];
[toolbar setDisplayMode:NSToolbarDisplayModeIconAndLabel];
[toolbar setAllowsUserCustomization:NO];
[toolbar setAutosavesConfiguration:NO];
[self.window setToolbar:toolbar];
[toolbar release];
这一切都很好,但当我加上[toolbar setDelegate:self];
我得到以下错误:
错误:委托无效(未实现所有必需的方法),因此无法使用!(要进行调试,请在NSToolbarError 中添加断点
根据NSToolbarDelegate的说法,没有必要的方法,那么这里出了什么问题?
为了使工具栏以NSWindowController
子类作为其委托来工作,您必须声明它符合NSToolbarDelegate
协议:
@interface MyController : NSWindowController <NSToolbarDelegate>
此外,在文档中,您必须确保某些是实现的,即使它们是可选的,因为您是以编程方式创建工具栏的。它们是:
-(NSToolbarItem *)toolbar:(NSToolbar *)toolbar
itemForItemIdentifier:(NSString *)itemIdentifier
willBeInsertedIntoToolbar:(BOOL)flag;
-(NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar;
-(NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar;
重要虽然此方法在NSToolbarDelegate协议中标记为@optional,但如果以编程方式创建关联的工具栏,则必须实现此方法。在界面生成器中创建的工具栏可以实现此方法以增强功能。
根据提供的好答案,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]