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 ([email protected])
>>
>> 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 [email protected]
>
_______________________________________________
Cocoa-dev mailing list ([email protected])
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]