鼠标点击NSTokenField



我想实现一个NSTokenField,这将显示令牌-当悬停在令牌-显示移除图标。随后,当我点击图标时,我希望令牌被删除。

经过大量的搜索,似乎这是不可能的标准NSTokenField。如果有人知道怎么做,请告诉我。

我已经看了https://github.com/octiplex/OEXTokenField,并基于该代码,我已经在Swift中实现了CustomTokenField。到目前为止,我有一个工作CustomTokenField,当我将鼠标悬停在令牌上时,它显示了一个删除图标。

下一个阶段是一个我自己无法解决的问题。我怎么能得到一个点击令牌触发回调。

令牌类派生自NSTextAttachmentCell, CustomTokenField派生自NStokenField:

class CustomTokenAttachmentCell: NSTextAttachmentCell {
    . . .
}
class CustomTokenField: NSTokenField {
    . . .
}

我试着从两个不同的角度来解决这个问题:

通过CustomTokenAttachmentCell

NSTextAttachmentCell实现了NSTextAttachmentCell协议。

public protocol NSTextAttachmentCellProtocol : NSObjectProtocol {
    . . .
    public func wantsToTrackMouse() -> Bool
    public func highlight(flag: Bool, withFrame cellFrame: NSRect, inView controlView: NSView?)
    public func trackMouse(theEvent: NSEvent, inRect cellFrame: NSRect, ofView controlView: NSView?, untilMouseUp flag: Bool) -> Bool
    . . .
}

这很有希望。所以我实现了这些方法在CustomTokenAttachmentCellwantsToTrackMouse()实际上是被调用。我已经实现了返回' true '。

override func trackMouse(theEvent: NSEvent, inRect cellFrame: NSRect, ofView controlView: NSView?, untilMouseUp flag: Bool) -> Bool {
    Swift.print(“trackMouse”)
    return true
}
override func highlight(flag: Bool, withFrame cellFrame: NSRect, inView controlView: NSView?) {
    Swift.print("highlight")
}
override func wantsToTrackMouse() -> Bool {
    Swift.print(“trackMouse”)
    return true
}

其他两个方法永远不会被调用。是否还需要做一些其他的事情来使它们被调用?

通过CustomTokenField

我也试图从CustomTokenField来解决这个问题。可以使用MouseDown()获得鼠标事件,但是我不能找到一种从单元访问令牌的方法。

我在StackOverflow上看到了很多帖子,我也看到了一些技巧,但似乎没有一个指向正确的方向。

不知何故,我得出的结论是,你只能在有一个NSControl在层次结构的情况下获得鼠标事件。对于代币来说,情况并非如此。NSControl是视图层次结构的一部分,因此我试图通过CustomTokenField来实现这一点,但我在那里也陷入了死胡同。例如,这个问题在NSTokenField中点击令牌是完全相同的,但设置动作或目标将产生致命错误,因为setActionsetTarget是基类的存根。

我是cocoa的初级程序员,所以希望这只是一个缺乏知识的问题。

您是否尝试在所有整个CustomTokenAttachmentCell视图的顶部添加NSButton ?然后添加一个@IBOutlet action按钮的点击,并通过委托传递给TokenField,在那里你可以控制显示的令牌。

我也试图在我的应用程序中实现这一点,所以如果你能分享任何代码,我将不胜感激。谢谢!

相关内容

  • 没有找到相关文章

最新更新