防止 NSToolbarItem 被删除

问题描述 投票:0回答:3

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

我尝试使用自定义

NSToolbar
实现创建
removeItem(at:)
的自定义子类,但如果用户将项目拖出自定义调色板中的工具栏,似乎甚至不会调用此方法。

委托似乎也没有公开这方面的功能。

如何禁止删除某些

NSToolbarItem

swift macos cocoa appkit
3个回答
1
投票

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

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)
        }
    }
}

0
投票

由于如果私有 API 调用停止工作,删除它们并不是非常重要,所以我选择了私有 API 解决方案。

extension NSToolbarItem {

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

这与广告中的完全一样。


0
投票

当使用 macOS 13 或更高版本时,有一种官方方法可以通过实现

toolbarImmovableItemIdentifiers
NSToolbarDelegate
功能来防止删除某些工具栏项目,如下所示:

func toolbarImmovableItemIdentifiers(_ toolbar: NSToolbar) -> Set<NSToolbarItem.Identifier> {
    return [.toggleSidebar, .toggleInspector]
}
© www.soinside.com 2019 - 2024. All rights reserved.