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