トークンにカーソルを合わせると削除アイコンが表示されるトークンを表示するNSTokenFieldを実装したいと思います。その後、アイコンをクリックすると、トークンが削除されます。
多くの検索の後、これは標準のNSTokenFieldでは不可能であるようです。誰かが方法を知っているなら、私に知らせてください。
https://github.com/octiplex/OEXTokenFieldを見て、そのコードに基づいて、Swift で CustomTokenField 実装を作成しました。これまでのところ、CustomTokenFieldが動作していて、トークンにカーソルを合わせると、削除アイコンが表示されます。
次のフェーズは、自分ではわからない問題であることがわかりました。トークンをクリックしてコールバックをトリガーするにはどうすればよいですか?
トークン クラスは NSTextAttachmentCell から派生し、CustomTokenField は NStokenField から派生します。
class CustomTokenAttachmentCell: NSTextAttachmentCell {
. . .
}
class CustomTokenField: NSTokenField {
. . .
}
私は2つの異なる角度を使用してこれにアプローチしようとしました:
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 に実装し、 wantToTrackMouse ()が実際に呼び出されています。「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
}
他の 2 つのメソッドは呼び出されません。それらが呼び出されていることを確認するために行う必要があることは他にありますか?
CustomTokenField を介して
また、 CustomTokenFieldからこれにアプローチしようとしました。MouseDown()を使用してマウス イベントを取得することは可能ですが、セルからトークンに実際にアクセスする方法が見つかりませんでした。
私は StackOverflow に関する多くの投稿を見てきましたが、ヒントも見ましたが、どれも正しい方向を示していないようです。
どういうわけか、階層に NSControl がある場合にのみマウス イベントを取得できるという結論に達しました。そうでないトークンの場合。NSControl はビューの階層の一部であるため、CustomTokenFieldを介してこれを達成しようとしましたが、そこでも行き止まりで実行されます。たとえば、この質問NSTokenField のクリック トークンはまったく同じですが、 setActionとsetTargetは基本クラスのスタブであるため、アクションまたはターゲットを設定すると致命的なエラーが発生します。
私は Coacoa の初心者プログラマーなので、これは単なる知識不足の問題であることを願っています。
アドバイスをいただければ幸いです。