鼠标点击NSTokenField

时间:2016-08-26 18:23:46

标签: swift cocoa nstokenfield nstextattachment

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

经过大量搜索后,标准的 NSTokenField 似乎无法做到这一点。如果有人知道请告诉我。

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

下一阶段结果是一个我无法弄明白的问题。如何点击令牌触发回调。?

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

class CustomTokenAttachmentCell: NSTextAttachmentCell {
    . . .
}

class CustomTokenField: NSTokenField {
    . . .
}

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

通过CustomTokenAttachmentCell

NSTextAttachmentCell实现了NSTextAttachmentCellProtocol。

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

这是有希望的。所以我在 CustomTokenAttachmentCell 中实现了这些方法,并且实际上正在调用 wantsToTrackMouse()。我已经实现了返回'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 实现这一点,但我也在那里运行。 例如。此问题Clicking token in NSTokenField完全相同,但设置操作或目标将产生致命错误,因为 setAction setTarget 是基类的存根。

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

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您是否尝试在所有CustomTokenAttachmentCell视图之上添加NSButton?然后在点击按钮上添加@IBOutlet action,并通过委派将其传递到TokenField,您可以在其中控制显示的令牌。

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