コードオンリー Cocoa Bindings で NSTableColumn に bind する方法

2020年の終わりに書く記事がこれか?

私は macOS でも iOS でも基本的にコードオンリーでUIを書いているのだけれど、今までコードオンリーの Cocoa Bindings で NSTableView にデータを表示する時に *1 カラム毎に objectValue の keyPath を指定する方法を見つけられていなかった。

ので、こういう変なコードを書いて誤魔化していた。

let field = NSTextField(string: "")
let wrapper = WrapperView(wrapped: field)
field.bind(.value, to: wrapper, withKeyPath: "objectValue.title", options: nil)

が、実は NSTableColumn に下記のようなやり方で Binding を指定すればいいことを発見した。

let column: NSTableColumn = .init(...)
column.bind(.value, to: arrayController, withKeyPath: "arrangedObjects.title", options: nil)

要はbind先を NSArrayController にして keyPath の objectValuearrangedObjects にすればよい。なるほどね。

コードオンリーでUI書いている人は macOS アプリ開発者だとあんまりいなくて (そもそも iOS アプリ開発者でもあんまりいないけど macOS アプリ開発者は全体のパイが小さいのでもっと少ない)、さらに Cocoa Bindings を Swift で使ってる人、というと私以外にいるのか怪しいレベルだけど、もし参考になる人がいたら *2

それでは、よいお年を!

*1:というか 2020 年においてあえて Cocoa Bindings 使う必要があるのってもはやここくらいしかないような。勝手に双方向バインディングやってくれるので楽ではあるけど…

*2:参考にするのは数ヶ月後の自分かもしれないが