こまごまと、選択状態の取得とセルの編集について書いてみた。
選択状態の取得方法
複数選択でない場合
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()
}
}
}
}
コメント