On Mar 25, 2010, at 00:32, Quincey Morris wrote:

> On Mar 24, 2010, at 23:42, Laurent Daudelin wrote:
> 
>> In the Preferences.nib file, the checkbox and the textfield are bound to the 
>> defaults controller. So far, so good. In the application delegate's 
>> applicationWillFinishLaunching:, they have those 2 lines:
>> 
>>      [self bind:SKTAppAutosavesPreferenceKey toObject:userDefaultsController 
>> withKeyPath:[@"values." 
>> stringByAppendingString:SKTAppAutosavesPreferenceKey] options:nil];
>>      [self bind:SKTAppAutosavingDelayPreferenceKey 
>> toObject:userDefaultsController withKeyPath:[@"values." 
>> stringByAppendingString:SKTAppAutosavingDelayPreferenceKey] options:nil];
>> 
>> The app delegate, by binding these properties to the user defaults 
>> controller, then has its setAutosaves: and setAutosaveDelay: methods called 
>> each time the checkbox is toggled or the text field value is changed. How 
>> does that work behind the scene? The user defaults controller of course has 
>> the keys saved in the user preferences set in IB. Maybe it's late but I fail 
>> to understand this.
> 
> The [NSObject bind:] method implements functionality that's useful as *part* 
> of a custom bindings implementation. As it happens, the method is also usable 
> in isolation as a sort of observation convenience method. (People sometimes 
> call this usage a "binding" or a "one-way binding" though by itself it 
> doesn't meet the requirements of a bindings implementation. But that's a 
> different soapbox.)
> 
> Let's call the 1st parameter the "receiver key", the 2nd parameter the 
> "target" object, and the 3rd parameter the "target key path".
> 
> What the method does, in essence, is to establish the receiver as a 
> KVO-observer of the target object for the target key path. In addition, when 
> a KVO notification arrives, if the receiver key is actually a KVC property of 
> the receiver, it sets that property to the value that changed at the target 
> object's target key path.
> 
> In other words, the receiver's property is made to track changes in the 
> target property. In the above example, this makes the app delegate's property 
> values follow the user defaults values.
> 
> It works just fine, but I think this use of the 'bind:' method is an abuse of 
> the API, especially as there are at least 2 other simple ways of getting the 
> same effect:
> 
> You could do the same thing yourself, by calling [userDefaultsController 
> addObserver: self forKeyPath: ...] and providing an 
> 'observeValueForKeyPath:...' method to transfer the changed value to the 
> observer's property.
> 
> You could also make the app delegate's properties be derived properties, 
> having the app delegate getter retrieve the user interface controller values 
> directly, and using the keyPathsForValuesAffecting<Key> mechanism to provide 
> KVO compliance.

I see. I thought about observing those properties managed by the user defaults 
controller but after I read the document "Controller Key-Value Observing 
Compliance", I saw that NSUserDefaultsController is a key-value-observing only 
for a limited set of its own properties. That left me thinking that I would not 
be able to observe the user defaults properties managed by the controller but 
maybe I'm not ready this correctly?

-Laurent.
-- 
Laurent Daudelin
AIM/iChat/Skype:LaurentDaudelin                                 
http://nemesys.dyndns.org
Logiciels Nemesys Software                                              
laurent.daude...@gmail.com
Photo Gallery Store: http://laurentdaudelin.shutterbugstorefront.com/g/galleries

_______________________________________________

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