通过代码创建NSToolbar时itemForItemIdentifier方法未被调用
问题原因与验证方案
你遇到的情况是因为使用了AppKit内置的工具栏项标识符(.toggleSidebar、.print),这类标识符对应的工具栏项由系统自动创建和管理,完全不需要通过代理方法toolbar(_:itemForItemIdentifier:willBeInsertedIntoToolbar:)提供,所以你的断点不会触发;哪怕返回nil,系统也会自行生成标准的工具栏项。
验证代理方法的调用逻辑
自定义一个工具栏项标识符,替换或添加到现有数组中,系统找不到内置对应项时,就会触发你的代理方法:
// 自定义工具栏项标识符 extension NSToolbarItem.Identifier { static let customItem = NSToolbarItem.Identifier("CustomItem") } // 修改默认与允许的标识符数组 func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { return [ .toggleSidebar, .print, .customItem ] } func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { return [ .toggleSidebar, .print, .customItem ] } // 代理方法中处理自定义项 func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { if itemIdentifier == .customItem { let item = NSToolbarItem(itemIdentifier: itemIdentifier) item.label = "自定义项" item.image = NSImage(systemSymbolName: "star", accessibilityDescription: nil) return item } // 系统内置项直接返回nil即可,系统会自动处理 return nil }
运行后,自定义项的创建会触发你设置的断点,而系统内置项依然不会走这个方法。
关于Xcode的报错提示
删除toolbar(_:itemForItemIdentifier:willBeInsertedIntoToolbar:)后Xcode提示“未实现所有必需方法”,是因为该方法在NSToolbarDelegate底层协议中被标记为Objective-C必需方法(Swift中显示为可选,但编译检查会要求实现),哪怕暂时用不上,也需要保留方法实现,否则会触发编译警告/错误。

内容的提问来源于stack exchange,提问作者arjndr
相关产品推荐
相关产品推荐

