私のアプリケーションのウィンドウには3つのペインを持つsplitviewがあります。一番左のペインはビューベースのアウトラインビューをホストします。NSWindow.contentView.hittest()はNSOutlineViewのサブビューに達しません
私はそのアウトラインビューのどこかをクリックすると、クリックされた階層の一番下のサブビューを特定したいと思います。つまり、どの行、どのセル、そして最終的にどのセルのサブビュー(コントロール)がクリックされたかです。
mouseDown(with:)
をホストビューコントローラでオーバーライドしようとしましたが、呼び出されませんでした。アウトラインビューが何らかの形でイベントを呼び起こしていると思っていたので、代わりに私のNSOutlineView
サブクラス自体でメソッドを直接オーバーライドすることにしました。これは機能します。
クラスMyOutlineView:NSOutlineView {
override func mouseDown(with event: NSEvent) {
if let view = self.window?.contentView?.hitTest(event.locationInWindow) {
Swift.print("\(view.className)")
}
}
...プリント:
MyOutlineViewはMyModuleというしかし、そこから私はさらにアウトラインビュー自体よりも下の階層の任意に行くことができません。
hittest()
のドキュメントは読み取ります
が最も遠い指定された点を含む (自身を含む)のビュー階層内のビューの子孫、またはnilを返すこと ポイントにある場合完全に視界の外側にある。このメソッドは、NSWindowオブジェクトによって主に で使用され、 マウスダウンイベントを受け取るビューを決定します。ほとんどの場合、このメソッドを呼び出す必要はありませんが、 は、ビューオブジェクトがそのサブビューからマウスダウンイベント を隠すように、それをオーバーライドすることができます。このメソッドは隠しビューを無視します。
アウトラインビューの最上部のサブビューをテストするにはどうすればよいですか?
ありがとうございます。私は、https://instagram.com/p/BY-57nMFUvy/を私のアウトラインビューに適用してこのコードを修正しました。リンクされたリポジトリ_does_は、ビューコントローラ上で 'mouseDown(with:)'を使用します。 –
そこにあるコメントに示唆されているように、アウトラインビューで 'validateProposedFirstResponder:forEvent:'をオーバーライドして、特定の 'NSView'サブクラスに対して' true'を返しました。 –
あなたは 'mouseDown(with:)'とコントローラについて正しいです。 – Willeke