NSTableViewでセルの編集をしたい時にハマったこと
macOSのNSTableViewを使う時、最近はdelegateとかdataSourceとか使わずにバインディングを使ってる。その方が楽だからだ。
macOSでバインドを使いテーブルを表示する
↑基本はこんな感じ。
今回、このようなNSArrayControllerを使って表示しているテーブル内のセルの値を直接編集しようとしてハマったところをメモ。

1. セル(NSTextField)のBehavior(上の図)をEditableにする。
2. セルの入力(編集)完了を拾いたい場合にはAction(上の図)をSent On End Editingとしておき、
Sent Actionsで自分で設定したメソッドに接続しておく(下の図)。

かつ、tableViewのdelegateを接続しておく(なぜかセルのNSTextFieldのdelegateではない!)。
3. xibファイルにNSTableViewを設置したらtableのセル(のNSTextField)にはデフォではNumberFormatterは設定されてない。
NumberFormatterを後から設定する場合、

↑この部分をドラッグしてセルにドロップすればいけた。
4. セルのバインディングの設定で参照する変数の型がStringならいいけどIntやFloatだと
Property cannot be marked @objc because its type cannot be represented in Objective-C
となってしまう。なのでNSNumber型にした。
厳密には当方の都合によりNSNumber?型にしてる
5. 上記のNSNumber?で値がまだnilの場合にはplaceholderを表示させたい。

↑この場合、NSTextFieldのではなく(なんでや?!)、セルのバインディングの設定ペインの”Null Placeholder”に記述するといけた。

↑placeholder表示した様子。
NSTableViewはいつもながら苦労するけど、SwiftUIになったらこんなの一撃なんかなあと妄想。
macOS 10.15.6 Catalina
Xcode 11.7
Swift 5.2.4
macOSでバインドを使いテーブルを表示する
↑基本はこんな感じ。
今回、このようなNSArrayControllerを使って表示しているテーブル内のセルの値を直接編集しようとしてハマったところをメモ。

1. セル(NSTextField)のBehavior(上の図)をEditableにする。
2. セルの入力(編集)完了を拾いたい場合にはAction(上の図)をSent On End Editingとしておき、
Sent Actionsで自分で設定したメソッドに接続しておく(下の図)。

かつ、tableViewのdelegateを接続しておく(なぜかセルのNSTextFieldのdelegateではない!)。
3. xibファイルにNSTableViewを設置したらtableのセル(のNSTextField)にはデフォではNumberFormatterは設定されてない。
NumberFormatterを後から設定する場合、

↑この部分をドラッグしてセルにドロップすればいけた。
4. セルのバインディングの設定で参照する変数の型がStringならいいけどIntやFloatだと
Property cannot be marked @objc because its type cannot be represented in Objective-C
となってしまう。なのでNSNumber型にした。
厳密には当方の都合によりNSNumber?型にしてる
5. 上記のNSNumber?で値がまだnilの場合にはplaceholderを表示させたい。

↑この場合、NSTextFieldのではなく(なんでや?!)、セルのバインディングの設定ペインの”Null Placeholder”に記述するといけた。

↑placeholder表示した様子。
NSTableViewはいつもながら苦労するけど、SwiftUIになったらこんなの一撃なんかなあと妄想。
macOS 10.15.6 Catalina
Xcode 11.7
Swift 5.2.4
スポンサーサイト
<< NSSecureCodingでオプショナル型の保存、読み込み方法 TopPage NSSegmentedControlで選択時の画像を白くする >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1358-c8a24711
https://ringsbell.blog.fc2.com/tb.php/1358-c8a24711