Thanks everyone for your help on this,

I found out my problem was how I was overriding 
-bind:toObject:withKeyPath:options:.   

In my implementation when adding a view as an observer I neglected to add 
NSKeyValueObservingOptionOld to the options.

Once I did that I was able to see the old values of the array.

Thank!
Mazen Abdel-Rahman


On May 19, 2010, at 3:00 AM, Ken Thomases wrote:

> On May 19, 2010, at 2:05 AM, Mazen M. Abdel-Rahman wrote:
> 
>> I have a custom view class with an array property.  I want to bind that 
>> array property to a model - which in my case is an array that is in a 
>> container/manager object.  The binding is done via  a custom view controller 
>> (in it's awakeFromNib). (calendar is the model object)
>> 
>>      [calendarView bind:@"events" 
>>                        toObject:calendar 
>>                 withKeyPath:@"events" 
>>                         options:options];
>> 
>> Now whenever "events" in the object calendar is modified "events" in 
>> calendarView is modified as well. 
>> 
>> In addition - observeValueForKeyPath... is getting called as well in the 
>> calendarView.
>> 
>> The problem is that if some items are removed from calendar's (the model) 
>> "events array" by the time observeValueForKeyPath in calendarView  gets 
>> called its "events" array has already been updated to reflect the model 
>> change.  
> 
> I think you have two options:
> 
> * Override -bind:toObject:withKeyPath:options: and don't rely on the default 
> implementation, at all.
> 
> * Use the default implementation but don't use 
> -observeValueForKeyPath:ofObject:change:context: to be informed about the 
> change of the view's property.  Use the property's setter method, instead.
> 
> 
> I would not expect that the view's property would already be updated at the 
> time that -observeValueForKeyPath:... is called, because by what mechanism 
> other than that method would the binding update that property?  The answer, I 
> guess, is that the default implementation of -bind:... is actually setting 
> some other object (not the receiver) as the key-value observer of the key 
> path of the observableController, and that object is getting the 
> -observeValueForKeyPath:... message and then setting the property on your 
> view.  However, if that's the case, I don't know why your view would have 
> -observeValueForKeyPath:... invoked on it, too.  So, there's a bit of a 
> mystery there.  And that's reason enough not to rely on the default 
> implementation -- it's a black box with ill-defined behavior.
> 
> Overriding -bind:... is actually the method illustrated in Apple's 
> documentation about implementing a custom binding on a custom view.  See the 
> "How Do Bindings Work?" section of the Cocoa Bindings Programming Topics.
> 
> Also, have a look at the Sketch+Accessibility sample code, where it 
> implements custom binding (e.g. SKTGraphicView).  It actually illustrates 
> both approaches.
> 
> Regards,
> Ken
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to