Swift 防止拆下NSToolbarItem

Swift 防止拆下NSToolbarItem,swift,macos,cocoa,appkit,Swift,Macos,Cocoa,Appkit,我想防止用户删除某些工具栏项目。它们仍然应该是可移动的,只是不能移动 我尝试使用自定义的removietem(at:)实现创建NSToolbar的自定义子类,但如果用户从自定义调色板中的工具栏中拖出一个项目,似乎甚至不会调用此方法 委托似乎也没有为此公开功能 如何禁用删除某些NSToolbarItems?我不确定您是否可以阻止删除它,但您可以实现可选的toolbardiremoveItem方法并插入不希望删除的项目: import Cocoa class WindowController: N

我想防止用户删除某些工具栏项目。它们仍然应该是可移动的,只是不能移动

我尝试使用自定义的
removietem(at:)
实现创建
NSToolbar
的自定义子类,但如果用户从自定义调色板中的工具栏中拖出一个项目,似乎甚至不会调用此方法

委托似乎也没有为此公开功能


如何禁用删除某些
NSToolbarItem
s?

我不确定您是否可以阻止删除它,但您可以实现可选的toolbardiremoveItem方法并插入不希望删除的项目:

import Cocoa

class WindowController: NSWindowController, NSToolbarDelegate {
    @IBOutlet weak var toolbar: Toolbar!
    override func windowDidLoad() {
        super.windowDidLoad()
        toolbar.delegate = self
    }
    func toolbarDidRemoveItem(_ notification: Notification) {
        if let itemIdentifier = (notification.userInfo?["item"] as? NSToolbarItem)?.itemIdentifier,
           itemIdentifier.rawValue == "NSToolbarShowColorsItem" {
            toolbar.insertItem(withItemIdentifier: itemIdentifier, at: 0)
        }
    }
}

由于在私有API调用停止工作的情况下删除它们并不是非常关键,所以我选择了私有API解决方案

extension NSToolbarItem {

    func setIsUserRemovable(_ flag: Bool) {
        let selector = Selector(("_setIsUserRemovable:"))
        if responds(to: selector) {
            perform(selector, with: flag)
        }
    }
}

这与广告中的效果完全一样。

似乎有道理,但不幸的是,它无法保留当前物品的位置。@ErikAigner我将尝试找出是否有方法记住其最后位置