Cocoa Bindings。ボタンを監視するには? 解決!?
一応、動作としては希望どおりだったのだけれどやっぱり気に入らなくて一日粘ってみた結果、解決(たぶん)しました。結論を先に書くと、実装するレイヤを変えました。NSArrayControllerにcanXXXX的なメソッドが定義されているので何も考えずコントローラにcanCopyを実装していましたがこれをモデルで実装するよう変更。加えて、
- Action Invocation:target
- Bindings To: MyArrayController
- Contoller Key: selection
- Model Key Path: 指定なし
- Selector Name:copyText
- Availability:enabled
- Bindings To: MyArrayController
- Contoller Key: selection
- Model Key Path: canCopy
Targetのプロパティにselector nameがあるのを見落としていました。直感的には、Action Invocation:targetのModel Key PathにcopyTextを指定したほうがわかりやすいと思うのですが、この組み合わせだと、オブジェクトが選択されるたびcopyTextが呼び出されてしまい面白くありませんでした。buttonに対応するアクションはselector nameプロパティに設定するようです。
これで、コントローラからアウトレットやdelegateメソッドを取り払うことができてスッキリ。モデルの属性に依存するcanXXXXとモデル自体をどう扱う(追加とか削除とか)かのcanXXXXとでは実装するレイヤが異なるということでしょうか。NSArrayControllerのcanAddとかcanRemoveとかに惑わされてすっかり遠回りしてしまいました。
ちなみに、このままだと空のテキストフィールドに新しく入力したときにリアルタイムにボタンがEnableになりませんから、モデルのinitializeで監視設定をしておく必要もあります。
[self setKeys:[NSArray arrayWithObjects:@"myText",nil]
triggerChangeNotificationsForDependentKey:@"canCopy"];










Comments