[Mac] NSArrayController の KVO通知の中身が nil になる(現象記録)

2010年12月20日月曜日 | Published in | 2 コメント

このエントリーをはてなブックマークに追加

NSTableView→NSArrayController→NSMutableArray とバインドしている状態でテーブルのカラムの値の変化を NSArrayControllerのKVO経由で取得してみた。

KVOの登録はこんな感じ。
[_userArrayController addObserver:self
         forKeyPath:@"arrangedObjects.title"
         options:NSKeyValueObservingOptionOld|
         NSKeyValueObservingOptionNew|
         NSKeyValueObservingOptionInitial|
         NSKeyValueObservingOptionPrior
         context:nil];
カラムの編集前後で下記が呼び出される。
- (void)observeValueForKeyPath:(NSString *)keyPath
       ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
        :
}
change を見ると変更前後の値が共に nil になっていて値が取得できなかった。
[81129:a0f] change={
    kind = 1;
    new = <null>;
    old = <null>;
}

既知の問題なのか仕様なのかわからない。ネットで探すと同じ現象が報告されていた。
cocoa - Observer properties of objects in an NSArrayController - Stack Overflow
forKeyPath:@"arrangedObjects.name" 
forKeyPath:@"contentArray.name" 
forKeyPath:@"content.name" 
forKeyPath:@"selection.name" 
forKeyPath:@"selectedObjects.name"
いろんな keyPathを試しているようだが駄目っぽい。

KVO for NSArrayController subclass
ずいぶん昔からあるようなので仕様なのか?

- - - -
NSArrayController を対象に Undo機能を実装しようとしているが KVOが使えないので困っている。仕方がないので NSArrayController のサブクラスを作り対応しようとしているが今度は objectDidBeginEditing: の引数(実体が非公開のNSTextValueBinder)の扱いで困っている。編集前後のイベントは取れるが値が取得できない。うーむ。

Responses

  1. 匿名
    2010年12月27日 13:57

    Important: The Cocoa bindings controller classes do not provide change values when sending key-value observing notifications to observers. It is the developer’s responsibility to query the controller to determine the new values.

    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/Articles/ControllerKey-ValueObservingCompliance.html%23//apple_ref/doc/uid/TP40002493-SW1

  2. 匿名
    2010年12月27日 13:57

    Important: The Cocoa bindings controller classes do not provide change values when sending key-value observing notifications to observers. It is the developer’s responsibility to query the controller to determine the new values.

    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/Articles/ControllerKey-ValueObservingCompliance.html%23//apple_ref/doc/uid/TP40002493-SW1

  3. xcatsan says:
    2010年12月27日 15:37

    なるほど。仕様のようですね。
    情報どうも。

  4. xcatsan says:
    2010年12月27日 15:37

    なるほど。仕様のようですね。
    情報どうも。

Leave a Response

人気の投稿(過去 30日間)