Cocoa Bindings。ボタンを監視するには?

in

Cocoa Bindingsと格闘中。私的に欲しいと思っていたツールを作成しているんですがBindingの理解(というか Cocoaフレームワークの理解)がいまひとつでうまくいきません。あるエンティティの属性とバインドしたTextFieldに中身のコピー用ボタンを付けたのですがこれをうまくenable/disableコントロールできません。

IBのBindingsパネルでCopyボタンのenable項目のController KeyにMyArrayController.canCopy、Traget項目のController KeyにMyArrayController.copyTextを指定。canCopyの中身は

-(BOOL)canCopy
{
  id txt = [[self selection] valueForKey:@"mytext"];

  if ([txt isKindOfClass:[NSNoSelectionMarker class]]   ||
     [txt isKindOfClass:[NSNotApplicableMarker class]] ||
     [txt isKindOfClass:[NSMultipleValuesMarker class]])
  {
     return NO;
  }
  if ([txt length] > 0)
  {
    return YES;
  }
  return NO;
}

と単純そのものでフィールドに何か入力されているか否かでコピーボタンを有効・無効としたいだけなんですが。このままBuild/Runするとずっと無効のままで、まあ起動時はフィールドにはなにも入力されていないので無効なのは当たり前なんですが、最初に一回このcanCopyが評価されただけで以降は一度も評価されません。KVOのOが抜けているためというのはわかっているのですがじゃあいったいどこにOを実装したらいいんだか?サッパリです。NSObjectControllerのcanAddだのcanRemoveだのと同じ振る舞いをさせたいんですけどねぇ。チュートリアルにはエンティティ属性に対してOを実装する例はあったのですが、ボタンの場合エンティティ属性じゃないしもうしばらく悩みそう。

それにしてもCocoaのプログラミングはスゴイ。モデル図を書いてそのダイアグラムをIBにドロップするだけでほとんどのノーコードで簡単なアプリを作れちゃう。まあ、標準以外のことをやろうとすると途端にこの様なんですけどね。なんだか楽しくなってきた...

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/163

Comments