You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过代码创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:30:54