NSTableViewであるセルを編集できないようにする
macOSのNSTableViewで特定のあるセル1つだけは編集できないように設定しようとしてかなり苦労した。
storyboard(xibファイル)側でNSTableViewを設置して表示内容はNSArrayController使ってバインディングさせてる。
なお、このtableはscroll viewの下の方に位置しており、最初は表示されていない。
使えそうなのをNSTableViewDataSourceやNSTableViewDelegateなどで探し、ようやく
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
というNSTableViewDelegateメソッドにたどり着いた。
これでもうまくいかない。
なんでかなー?と調べたり試行錯誤してようやく気付いた。
storyboard側での設定で、セルにあるNSTextFieldのBehavior設定で

↑ここをEditableにすると、コードでどういう方法で頑張ってあるセルだけは編集不可と指定してもEditableになってしまう。
このBehaviorをNoneにしておいてあとはコードで上記のように指定すればいけた!
長かったわ、、、
macOS 10.15.6 Catalina
Xcode 11.7
Swift 5.2.4
storyboard(xibファイル)側でNSTableViewを設置して表示内容はNSArrayController使ってバインディングさせてる。
なお、このtableはscroll viewの下の方に位置しており、最初は表示されていない。
let tableCellView = tableView.view(atColumn: c,↑このようにしてNSTableViewオブジェクトから指定したいrow, columnのNSTableCellViewオブジェクトを取得し、tableCellView.textFieldからNSTextFieldオブジェクトが得られるので
row: r,
makeIfNecessary: true) as? NSTableCellView
textField.isEditable = falseとすればいけそうなもんだが、どうもうまくいかない。
使えそうなのをNSTableViewDataSourceやNSTableViewDelegateなどで探し、ようやく
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
というNSTableViewDelegateメソッドにたどり着いた。
func tableView(_ tableView: NSTableView,↑columnをidentifierで特定し、指定したrowだけは編集できなくする、というものだが、、、
viewFor tableColumn: NSTableColumn?,
row: Int) -> NSView? {
let tableCellView = tableView.makeView(withIdentifier: tableColumn!.identifier,
owner: self) as? NSTableCellView
if tableColumn!.identifier.rawValue == “someID" {
let isEditable: Bool = (row != r)
tableCellView!.textField!.isEditable = isEditable
}
return tableCellView
}
これでもうまくいかない。
なんでかなー?と調べたり試行錯誤してようやく気付いた。
storyboard側での設定で、セルにあるNSTextFieldのBehavior設定で

↑ここをEditableにすると、コードでどういう方法で頑張ってあるセルだけは編集不可と指定してもEditableになってしまう。
このBehaviorをNoneにしておいてあとはコードで上記のように指定すればいけた!
長かったわ、、、
macOS 10.15.6 Catalina
Xcode 11.7
Swift 5.2.4
スポンサーサイト