Aha!

I was missing the willChangeForKey: call.

- (IBAction) toggleIsCloning: (id) sender
{
        [self willChangeValueForKey:@"cloningLabel"];
        self.isCloning = !self.isCloning;
        [self didChangeValueForKey:@"cloningLabel"];
}

Now it works fine, thanks!

On Aug 6, 2008, at 10:07 PM, Bill Bumgarner wrote:

On Aug 6, 2008, at 9:51 PM, Steven W Riggins wrote:
I'm winding my way through KVO, readonly properties and bindings.

I have an object which has a bool state. I have a method that toggles that state.

I have a button that calls the method that toggles the state. The button has a title, which I've bound to a readonly property, which has a getter that returns a localized label based on the state.

So when I change the state, obviously the readonly property doesn't change, and thus the button label does not change.

Changing the readonly property to a normal ivar works fine.

Is there a way to use a synthesized property in this manner, or is it even proper?

You can solve this in the following two ways (amongst others):

(1) Redeclare the property as readwrite in a class extension in your .m file and then use dot syntax or the synthesized setter/ getter to set the value.

I.e.

.h:
@interface Foo : NSObject
{
        BOOL f;
}

@property(readonly, nonatomic) BOOL f;
@end

.m
@interface Foo()
@property(readwrite, nonatomic) BOOL f;
@end

@implementation Foo
@synthesize f;
// ... use the setter and getter as needed
@end

(2) Call willChange/didChange before/after you change the value:

- (void) toggle: sender
{
        .... logic ...
        [self willChangeValueForKey: @"f"];
        f = ... new state ...;
        [self didChangeValueForKey: @"f"];
}

b.bum

_______________________________________________

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 [EMAIL PROTECTED]

Reply via email to