After studying some about bindings during the last week, I decided that, just
for fun, I would bind an NSSegmentedControl to its window controller using a
binding instead of target/action. I thought that selectedSegment might be a
KVO-compliant property of NSSegmentedControl because it has a -selectedSegment
and -setSelectedSegment: method.
So I exposed a binding named @"foo" in my window controller's +initialize, in
-awakeFromNib I added this:
[windowController bind:@"foo"
toObject:segmentedControl
withKeyPath:@"selectedSegment"
options:0] ;
and finally in a "windowWillClose" cleanup method I added an unbind:.
The above code compiled and ran without any bitchin' from out of the console,
and at any time in the program if I send -infoForBinding:@"foo" to
windowController, I log the expected result:
bindingInfo = {
NSObservedKeyPath = selectedSegment;
NSObservedObject = <NSSegmentedControl: 0x1b879c90>;
NSOptions = {
NSMultipleValuesPlaceholder = <null>;
NSNoSelectionPlaceholder = <null>;
NSNotApplicablePlaceholder = <null>;
NSNullPlaceholder = <null>;
NSRaisesForNotApplicableKeys = 1;
NSValueTransformer = <null>;
NSValueTransformerName = <null>;
};
}
But it "just didn't work". Flipping that segmented control in the user
interface never caused my window controller's -setFoo: to run.
Did I do anything wrong?
If not, I conclude that NSSegmentedControl's is not KVO-compliant for property
'selectedSegment'. That is, the class implementation probably changes the view
without invoking the setter.
I changed to target/action and it works fine.
So how does one know whether a property in Cocoa class is KVO-compliant? I
can't find an answer in the Key-Value Observing Programming Guide. I thought
maybe there's a little point system:
1. Property has a setter and getter; i.e. -bar and -setBar:. Add 2 points.
2. I remember seeing, every now and then, in newer API documentation, a
notation that this "property is observeable", or something like that. Add 8
points.
3. Add 1 point for each Mac OS X dot release that the class first appeared in.
0 points for 10.0, 1 point for 10.1, etc.
4. If the class is a "view layer" class, subtract 2 points. Most people don't
usually bind to view classes.
5. Test it and see if it works. Add 5 points. What is the possibility that
it could stop working in a future Mac OS X release?
_______________________________________________
Cocoa-dev mailing list ([email protected])
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 [email protected]