On Feb 28, 2012, at 07:24 , Per Bull Holmen wrote: > Suppose I want to make a controller, which allows a view to bind to the > keyPath: > > mainBranch.subBranch.attribute > > There will be a large range of theoretical subBranch.attribute > combinations, but only a few of these will actually be bound to by the > user. Other combinations will therefore be uninteresting. The > attributes will be read-only and mostly static, values like > minValue/maxValue or isEditable. No actual control values. Suppose it > is much easier for me to have my controller produce these attributes > on-the-fly, in valueForKeyPath:, than to produce a tree structure to > hold all the information. The attributes will rarely change (typically > once per session), and when they do, the entire mainBranch will be > switched out.
On Feb 28, 2012, at 09:47 , Per Bull Holmen wrote: > Binding to the VALUES did still turn out pretty well now. But the > Audio Unit plugin API also has a standardized way for Audio Units to > give the hosts and GUI some static information about each parameter > such as min/max value, readonly or writable etc. To be able to bind to > this information too, it would be much easier for me to let the > controller just fetch this information on the fly, and notify > observers the few times it changes. Building a tree in memory would > require more bookkeeping, and would be harder because the controller > can not know in advance what string keys (which maps to parameters > IDs) it will be queried for, the controller is supposed to not have > any knowledge in advance of the possible model keys. But yeah, I'll > solve it either way. So now I know, there is no shortcut, I must make > every property on the key path KVC and KVO compliant. I don't think there's no shortcut. :) It's not clear from your description, but you seem to saying that there *is* a value object (of some custom class?) for "mainBranch". And a "subBranch" object? In that case, you don't have to override the controller's valueForKeyPath: to intercept "mainBranch.subBranch.nonExistentAttribute". Instead, override the subbranch object's valueForUndefinedKey: -- and also, if there are non-existent subbranches, the main branch's valueForUndefinedKey:. That allows you to avoid messing with the higher-traffic valueForKeyPath:. However, if the above is not feasible, I'd suggest you go ahead and override your controller's valueForKeyPath:. There's no particular reason to think it would cause a performance problem beyond the obvious effect of requiring some string comparisons as often as anything controller-dependent in the UI needs to update. (It probably *would* be a problem if you were trying to update, say, a volume meter in more or less real time using bindings, but you could do that a different way.) You would would invoke [super valueForKeyPath:] for all the normal cases anyway, so I wouldn't worry about "breaking" KVC. That should take care of KVC compliance. KVO compliance should be pretty easy, too. Since you switch out "the entire mainBranch", then -- assuming you do *that* KVO-compliantly as you should be doing -- any UI element bound to "mainBranch.subBranch.nonExistentAttribute" is going to get updated for free. If necessary, you can also generate notifications for "nonExistentAttribute" by sending a [subBranch will/didChangeValueForKey:] pair after something changes, but it doesn't sound like you need this. _______________________________________________ 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com