頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


NSTableViewであるセルを編集できないようにする

macOSのNSTableViewで特定のあるセル1つだけは編集できないように設定しようとしてかなり苦労した。
storyboard(xibファイル)側でNSTableViewを設置して表示内容はNSArrayController使ってバインディングさせてる。
なお、このtableはscroll viewの下の方に位置しており、最初は表示されていない。

let tableCellView = tableView.view(atColumn: c, 
row: r,
makeIfNecessary: true) as? NSTableCellView
↑このようにしてNSTableViewオブジェクトから指定したいrow, columnのNSTableCellViewオブジェクトを取得し、tableCellView.textFieldからNSTextFieldオブジェクトが得られるので
textField.isEditable = false
とすればいけそうなもんだが、どうもうまくいかない。

使えそうなのをNSTableViewDataSourceやNSTableViewDelegateなどで探し、ようやく
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?
というNSTableViewDelegateメソッドにたどり着いた。
    func tableView(_ tableView: NSTableView, 
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
}
↑columnをidentifierで特定し、指定したrowだけは編集できなくする、というものだが、、、
これでもうまくいかない。

なんでかなー?と調べたり試行錯誤してようやく気付いた。
storyboard側での設定で、セルにあるNSTextFieldのBehavior設定で

Xcodeの設定

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



macOS 10.15.6 Catalina
Xcode 11.7
Swift 5.2.4
スポンサーサイト




<< macOSでオブジェクトをクリップボードに入れる  TopPage  NSSecureCodingでオプショナル型の保存、読み込み方法 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1360-4edcf7e4




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.