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 (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