Re: Binding NSButton enabled state
Re: Binding NSButton enabled state
- Subject: Re: Binding NSButton enabled state
- From: Keary Suska <email@hidden>
- Date: Sun, 20 Apr 2008 14:02:52 -0600
- Thread-topic: Binding NSButton enabled state
on 4/20/08 11:47 AM, email@hidden purportedly said:
> On Sat, Apr 19, 2008 at 11:55 PM, Chris Hanson <email@hidden> wrote:
>
>> On Apr 19, 2008, at 11:08 AM, Lorenzo Thurman wrote:
>>
>> I have two NSTableViews, tableA and tableB, each managed by separate
>>> NSArrayControllers. When a selection is made in either table, an
>>> instance
>>> variable is set. I want to have an NSButton's enabled state to 'YES'
>>> whenever the instance variable is set.
>>>
>>
>> Don't think of it as an instance variable, think of it as a property.
>> Restating your problem, you want your "Do Something" button's enabled
>> property to be bound to your window controller's "can do something"
>> property.
>>
>> What this means is that you need to manipulate your window controller's
>> "can do something" property in a way that things bound to it can notice --
>> in other words, in a way that will post key-value observing notifications.
>> Thus instead of manipulating it as an instance variable, you should just
>> always invoke its setter.
>>
>> You haven't said how you're actually noticing that the selection in one of
>> your tables has changed; I assume you're either using an NSTableView
>> delegate method or a notification to do so.
>>
>> -- Chris
>>
>>
> Here's my code:I register to receive these notifications when the selection
> changes.
>
> -(void)applicationDidFinishLaunching:(NSNotification*)not{
>
>
> [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(
> usTableViewSelectionDidChange:) name:
> NSTableViewSelectionDidChangeNotification object:usCityTable];
>
> [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(
> intlableViewSelectionDidChange:) name:
> NSTableViewSelectionDidChangeNotification object:intlTable];
>
> }
>
>
> These are the messages sent when a selection is changed (Is there a way to
> use just one?):
Yes, if instead you make your controlling object the delegate to both
tableviews and implement -tableViewSelectionDidChange:.
> -(void) usTableViewSelectionDidChange:(NSNotification*)not{
>
> NSArray* selObjs = [usTableContent selectedObjects];
>
> if([selObjs count] > 0) {
>
> [intlTable deselectAll:self];
>
> NSDictionary* selectedDictionary = [selObjs objectAtIndex:0];
>
> [self setValue:[selectedDictionary objectForKey:@"location"] forKey:
> @"location"];
>
> [self setSelectedItem:selectedDictionary];
>
> }
>
> }
>
> -(void) intlableViewSelectionDidChange:(NSNotification*)not{
>
> NSArray* selObjs = [intlTableContent selectedObjects];
>
> if([selObjs count] > 0){
>
> [cityTable deselectAll:self];
>
> NSDictionary* selectedDictionary = [selObjs objectAtIndex:0];
>
> [self setValue:[selectedDictionary objectForKey:@"location"] forKey:
> @"location"];
>
> [self setSelectedItem:selectedDictionary];
>
> }
>
>
> }
Note that when you call -deselectAll:, that triggers an
NSTableViewSelectionDidChangeNotification, so you may want to watch out.
Your checks probably avoid loops, but the notifications will get sent more
often than is necessary.
Anyway, what kind of object is "location"? Are you applying any
transformers? If not, how are you considering how your object will get
coerced into a boolean?
HTH,
Keary Suska
Esoteritech, Inc.
"Demystifying technology for your home or business"
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden