我想防止用户删除某些工具栏项目。它们应该仍然是可移动的,只是不能re移动。
我尝试使用自定义
NSToolbar
实现创建 removeItem(at:)
的自定义子类,但如果用户将项目拖出自定义调色板中的工具栏,似乎甚至不会调用此方法。
委托似乎也没有公开这方面的功能。
如何禁止删除某些
NSToolbarItem
?
我不确定是否可以阻止它被删除,但您可以实现可选的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)
}
}
}
由于如果私有 API 调用停止工作,删除它们并不是非常重要,所以我选择了私有 API 解决方案。
extension NSToolbarItem {
func setIsUserRemovable(_ flag: Bool) {
let selector = Selector(("_setIsUserRemovable:"))
if responds(to: selector) {
perform(selector, with: flag)
}
}
}
这与广告中的完全一样。
当使用 macOS 13 或更高版本时,有一种官方方法可以通过实现
toolbarImmovableItemIdentifiers
的 NSToolbarDelegate
功能来防止删除某些工具栏项目,如下所示:
func toolbarImmovableItemIdentifiers(_ toolbar: NSToolbar) -> Set<NSToolbarItem.Identifier> {
return [.toggleSidebar, .toggleInspector]
}