こまごまと、選択状態の取得とセルの編集について書いてみた。

選択状態の取得方法

複数選択でない場合
NSTableViewのselectedRowやselectedColumnで参照できる。

        print("selectedRow:\(tableView.selectedRow)")
        print("selectedColumn:\(tableView.selectedColumn)")

複数選択の場合
NSTableViewのselectedRowIndexesやselectedColumnIndexesで参照できる。

        for idx in tableView.selectedRowIndexes {
            print("selectedRow:\(idx)")
        }
        for idx in tableView.selectedColumnIndexes {
            print("selectedColumn:\(idx)")
        }

セルの内容の編集

とりあえずデフォルトだと、セルをダブルクリックとかすると編集モードに入って、編集できるようになる。けど、反映されない(^^;)

まず、編集させないようにするには、ViewControllerクラスにNSTableViewDelegateプロトコルを実装するようにする。クラスの宣言のところにNSTableViewDelegateを追加する。

 class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate

ストーリーボードでテーブルビューのdelegateとView Controllerを接続する。
ViewControllerクラスに次のメソッドを実装する。

    func tableView(_ tableView: NSTableView,
                   shouldEdit tableColumn: NSTableColumn?,
                   row: Int) -> Bool {
        return false
    }

これでダブルクリックとかで編集モードに入らなくなる。falseを返すと編集モードに入らなくなるようにできる。当然、セルによって編集できたり、できなかったりさせるには、引数のtableColunmやrowを見てfalseやtrueを返してやればよい。

さて、編集できるようにしても入力した値が反映されない。されるようにするには、

    func tableView(_ tableView: NSTableView,
                   setObjectValue object: Any?,
                   for tableColumn: NSTableColumn?,
                   row: Int) {
	}

で実際のデータに反映してやればいい。こんな感じだ。

    func tableView(_ tableView: NSTableView,
                   setObjectValue object: Any?,
                   for tableColumn: NSTableColumn?,
                   row: Int) {
        if let str = object as? String,
            let tcol = tableColumn {
            if tcol.identifier == "Name" {
                datas[row].name = str
            } else if tcol.identifier == "Age" {
                if let age = Int(str) {
                    datas[row].age = age
                } else {
                    let alert = NSAlert()
                    alert.messageText = "入力エラー"
                    alert.runModal()
                }
            }
        }
    }