gpt4 book ai didi

cocoa - NSOutlineView如何在右键单击时显示蓝色轮廓

转载 作者:行者123 更新时间:2023-12-03 16:40:20 24 4
gpt4 key购买 nike

每个人都讨论过如何在右键单击时消除蓝色轮廓......但我除外。

相反,我正在尝试显示蓝色轮廓。

当我右键单击大纲 View 行时,我没有得到任何大纲。菜单出现了,但轮廓没有出现。

您可以看到下图中蓝色轮廓不可见:

enter image description here

<小时/>


以下是我想要实现的目标。

Blue outline

<小时/>

更新

这就是我实现NSMenu的方式。我对 NSOutlineView 进行了子类化,并制定了一个新协议(protocol)来覆盖 NSOutlineViewDelegate

这个想法是通过让 NSOutlineViewNSMenu 询问每个项目来使其变得简单,这样我们就可以为每个项目实现不同的菜单。它可以工作,但右键单击时不会显示蓝色轮廓 View 。

KRMenuOutlineView.swift

import Cocoa

@objc protocol KRMenuOutlineViewDelegate: NSOutlineViewDelegate {
// This method will ask NSMenu for each item in outline view
func outlineView(_ outlineView: KRMenuOutlineView, menuFor item: Any, event: NSEvent) -> NSMenu?
}

class KRMenuOutlineView: NSOutlineView {

override var delegate: NSOutlineViewDelegate? {
didSet {
if let newValue = delegate {
/*
* Swift doesn't support overriding inherited properties with different type
* like Objective C Does, therefore we need internal delegate.
*/
internalDelegate = unsafeBitCast(newValue, to: KRMenuOutlineViewDelegate.self)
} else {
internalDelegate = nil
}
}
}

private var internalDelegate: KRMenuOutlineViewDelegate?

override func menu(for event: NSEvent) -> NSMenu? {
let point = self.convert(event.locationInWindow, from: nil)
if let item = self.item(atRow: self.row(at: point)) {
return self.internalDelegate?.outlineView(self, menuFor: item, event: event)
}
return super.menu(for: event)
}
}

然后,我在 View Controller 中使用它,如下所示:

KRTreeViewController.swift

extension KRTreeViewController: KRMenuOutlineViewDelegate {
func outlineView(_ outlineView: KRMenuOutlineView, menuFor item: Any, event: NSEvent) -> NSMenu? {
let menu = NSMenu(title: "Contextual Menu")
menu.delegate = self

let key = String(utf16CodeUnits: [unichar(NSBackspaceCharacter)], count: 1) as String
let deleteMenuItem = menu.addItem(withTitle: "Delete",
action: #selector(didClickMenuItem(_:)),
keyEquivalent: key)
deleteMenuItem.representedObject = myItem
deleteMenuItem.target = self

return menu
}

@objc fileprivate func didClickMenuItem(_ menuItem: NSMenuItem) {
// ...
}
}

最佳答案

如何正确显示上下文菜单:

如果您使用 Storyboard 创建菜单:首先,转到 Storyboard并将菜单添加到包含outlineView 的viewController。然后将其设为 @IBOutlet,以便您稍后可以引用它。

在像viewDidLoad()这样的方法中,通过调用将菜单添加到outlineView

outlineView.menu = myMenu

其中 myMenu 可以是您在 Interface Builder 中创建的菜单,也可以是在代码中创建的菜单。

您现在可以运行应用程序,并且应该会看到单元格周围有蓝色轮廓。

现在的问题是您不知道用户单击了哪个单元格。要解决此问题,请将您自己设置为 myMenu 的委托(delegate)并采用 NSMenuDelegate 协议(protocol)。

func menuNeedsUpdate(_ menu: NSMenu) {
let row = self.outlineView.clickedRow

guard row != -1 else { return }
for item in menu.items {
item.representedObject = row
}
}

在这里你可以做任何你需要做的事情。此实现将 rowIndex 设置为每个菜单项的representedObject。请记住,这仅适用于静态轮廓 View (在后台不会更改的 View )和仅一层深度的菜单。

您还可以将单元格表示的索引或对象(如果outlineView不是静态的)存储在局部变量中。

关于cocoa - NSOutlineView如何在右键单击时显示蓝色轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45384942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com