Ah ok I did not know about mutableArrayValue.

BTW is there any difference (performance or otherwise) between what you 
suggested (using mutableArrayValue) and what I did earlier?

Thanks
Hrishi

On 15-Oct-2010, at 3:40 PM, Chris Hanson wrote:

> My apologies - I dashed off my last email to you too quickly and made a 
> significant mistake in it.
> 
> I intended to suggest using -mutableArrayValueForKey: rather than 
> -valueForKey:.  For example:
> 
>    - (void)awakeFromNib {
>        [[self mutableArrayValueForKey:@"myListRoot"] addObject:foo];
>        [[self mutableArrayValueForKey:@"myListRoot"] addObject:bar];
>        [[self mutableArrayValueForKey:@"myListRoot"] addObject:baz];
>    }
> 
> or
> 
>    - (void)awakeFromNib {
>        NSMutableArray *myListRootProxy = [self 
> mutableArrayValueForKey:@"myListRoot"];
>        [myListRootProxy addObject:foo];
>        [myListRootProxy addObject:bar];
>        [myListRootProxy addObject:baz];
>    }
> 
> These will ensure KVO notifications are sent to any observers of your 
> object's "myListRoot" property when it is modified.  Note that it's about 
> modifying the property, not the array behind it.
> 
>  -- Chris
> 
> On Oct 15, 2010, at 3:05 AM, Hrishikesh Murukkathampoondi wrote:
> 
>> Thank you for the suggestion. I changed the code to use KVC like you 
>> suggested but it still makes no difference. But doing what you said along 
>> with calls to willChangeValueForKey and didChangeValueForKey
>> 
>> This worked:
>> 
>> -(void) awakeFromNib
>> {
>> 
>>   NSTreeNode *tn = [NSTreeNode treeNodeWithRepresentedObject:[NSString 
>> stringWithString:@"History"]];
>>  [self willChangeValueForKey:@"myListRoot"];
>>   [[self valueForKey:@"myListRoot"] addObject:tn];
>>   [self didChangeValueForKey:@"myListRoot"];
>> 
>> }
>> 
>> 
>> Even if I don't use KVC to add entries to myListRoot sending a reloadData to 
>> the NSOutlineView should refresh the contents correct? It does not work when 
>> I do [myOutlineView reloadData] after I update myListRoot.
>> 
>> Style issues - I agree. But this is a example I am using to teach myself. It 
>> is not part of a larger project.
>> 
>> Hrishi
>> 
>> 
>> On 13-Oct-2010, at 12:43 AM, Chris Hanson wrote:
>> 
>>> This implies that you’re not manipulating your “myListRoot” property in a 
>>> way compliant with Key-Value Observing.
>>> 
>>> Just manipulating the instance variable will not post KVO notifications for 
>>> the property.  You need to manipulate the property (for example, by working 
>>> with the proxy NSMutableArray returned by [self 
>>> mutableArrayValueForKey:@"myListRoot"]) in a KVO-compliant fashion for 
>>> bindings to notice your changes to it.
>>> 
>>> In other words, I think your -awakeFromNib code probably looked like this:
>>> 
>>> - (void)awakeFromNib {
>>>     myListRoot = [[NSArray alloc] initWithObjects:foo, bar, baz, nil];
>>> }
>>> 
>>> It should look like this:
>>> 
>>> - (void)awakeFromNib {
>>>     [[self valueForKey:@"myListRoot"] addObject:foo];
>>>     [[self valueForKey:@"myListRoot"] addObject:bar];
>>>     [[self valueForKey:@"myListRoot"] addObject:baz];
>>> }
>>> 
>>> The reason it may have worked in -init is that when your bindings set up 
>>> KVO for the "myListRoot" property, they may have retrieved its initial 
>>> value.
>>> 
>>> Also, just on a stylistic note, I wouldn't name a property something like 
>>> "list" in a Cocoa application to represent a collection presented in an 
>>> outline view; Cocoa's controls are "tables" and "outlines" rather than 
>>> "lists" and "trees."  (NSArrayController and NSTreeController use the terms 
>>> they do because they're about the structure of the data presented, not the 
>>> view; you can bind either an NSOutlineView or an NSBrowser to an 
>>> NSTreeController, for example.)  Ideally I'd name the property something 
>>> more related to what the data actually represents, e.g. "people" or 
>>> "products."
>>> 
>>> -- Chris
>>> 
>>> 
>>> On Oct 12, 2010, at 6:52 AM, Hrishikesh Murukkathampoondi wrote:
>>> 
>>>> I moved the code populating myListRoot to the "-init" method of 
>>>> MyDocument.m and now it works. I was earlier populating it in 
>>>> "-awakeFromNib".
>>>> 
>>>> I am so tried putting it back in -awakeFromNib followed by a call to 
>>>> [mOutlineView reloadData] - but this did not work. 
>>>> 
>>>> So I have my NSOutlineView showing me the text stored in my data root 
>>>> tree. But cant explain the above behavior.
>>> 
>> 
>> _______________________________________________
>> 
>> 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/cmh%40me.com
>> 
>> This email sent to c...@me.com
> 

_______________________________________________

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