diff --git a/ChangeLog b/ChangeLog index cf7c78023..49e3693b5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-12-15 Fred Kiefer + + * Source/NSKeyValueObserving.m (-keyPathChanged:): Correct + forwarding of changes. + 2007-12-15 Fred Kiefer * Source/NSValueTransformer.m, diff --git a/Source/NSKeyValueObserving.m b/Source/NSKeyValueObserving.m index d10142424..3262f2162 100644 --- a/Source/NSKeyValueObserving.m +++ b/Source/NSKeyValueObserving.m @@ -1026,10 +1026,6 @@ replacementForClass(Class c) - (void) keyPathChanged: (id)objectToObserve { - NSDictionary *change; - id oldValue; - id newValue; - if (objectToObserve != nil) { [observedObjectForUpdate removeObserver: self forKeyPath: keyForUpdate]; @@ -1040,35 +1036,54 @@ replacementForClass(Class c) | NSKeyValueObservingOptionOld context: target]; } - if (observedObjectForForwarding != nil) + if (child != nil) { - oldValue = [observedObjectForForwarding valueForKey: keyForForwarding]; - [observedObjectForForwarding removeObserver: self forKeyPath: - keyForForwarding]; + [child keyPathChanged: + [observedObjectForUpdate valueForKey: keyForUpdate]]; + } + else + { + NSMutableDictionary *change; + + change = [NSMutableDictionary dictionaryWithObject: + [NSNumber numberWithInt: 1] + forKey: NSKeyValueChangeKindKey]; + + if (observedObjectForForwarding != nil) + { + id oldValue; + + oldValue = [observedObjectForForwarding valueForKey: keyForForwarding]; + [observedObjectForForwarding removeObserver: self forKeyPath: + keyForForwarding]; + if (oldValue) + { + [change setObject: oldValue forKey: NSKeyValueChangeOldKey]; + } + } observedObjectForForwarding = [observedObjectForUpdate valueForKey:keyForUpdate]; - [observedObjectForForwarding addObserver: self - forKeyPath: keyForForwarding + if (observedObjectForForwarding != nil) + { + id newValue; + + [observedObjectForForwarding addObserver: self + forKeyPath: keyForForwarding options: NSKeyValueObservingOptionNew - | NSKeyValueObservingOptionOld + | NSKeyValueObservingOptionOld context: target]; - //prepare change notification - newValue = [observedObjectForForwarding valueForKey: keyForForwarding]; - change = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt: 1], NSKeyValueChangeKindKey, - oldValue, NSKeyValueChangeOldKey, - newValue, NSKeyValueChangeNewKey, - nil]; + //prepare change notification + newValue = [observedObjectForForwarding valueForKey: keyForForwarding]; + if (newValue) + { + [change setObject: newValue forKey: NSKeyValueChangeNewKey]; + } + } [target observeValueForKeyPath: keyPathToForward ofObject: observedObjectForUpdate change: change context: contextToForward]; } - else - { - [child keyPathChanged: - [observedObjectForUpdate valueForKey: keyForUpdate]]; - } } @end