MacアプリでNSTableViewのHeaderのクリックを取得する
Macアプリ で NSTableView の Header のクリックを取得します。
NSTableViewDelegate に tableView(_:mouseDownInHeaderOf:) というメソッドがあるので、これを使います。
code: Swift
extension ViewController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, mouseDownInHeaderOf tableColumn: NSTableColumn) {
print("mouseDownInHeaderOf")
}
}
ここまではよかったのですが、ヘッダーをクリックしたときと、セルをクリックしたときで処理を変えたいときに悩みました。
セルをクリックしたときには、 MacアプリのNSTableViewでセルのクリックで処理を実行する で書いたように、テーブルビューの IBAction を接続して、その中に処理を書きます。このときに、ヘッダーをクリックしたのか、それともセルをクリックしたのかをどうやって区別しようか悩みました。
いろいろ試した結果、ヘッダーをクリックしたときは、 clickedColumn が 0 、 clickedRow が -1 になることがわかりました。というわけで、つぎのようなコードにしました。
code: Swift
@IBAction func clickTableView(_ sender: NSTableView) {
let column = tableView.clickedColumn
let row = tableView.clickedRow
if column == 0 && row == -1 {
// ヘッダーをクリックしたときの処理
} else {
// ヘッダー以外をクリックしたときの処理
}
}
tableView(_:mouseDownInHeaderOf:) は、今回は使いませんでした。
NSTableViewDelegate には、 tableView(_:didClick:) というメソッドもあります。しかし、今回試したところ、セルをクリックしてもこのメソッドは呼び出されませんでした(ヘッダーをクリックしたときは呼び出されました)。
このメソッドが使えたら、 iOS の tableView(_:didSelectRowAt:) とおなじように使えてわかりやすいのですが。