Thank you!
As always I had paddled my way out into deep water and missed something 
important.

Key-Valued Coding Programming Guide: Ensuring KVC Compliance
Ensuring KVC Compliance, Indexed To-Many Relationship Compliance.

Cheers
Kevin

On 7/01/2011, at 7:39 PM, Quincey Morris wrote:

> On Jan 6, 2011, at 18:01, Kevin Bracey wrote:
> 
>> MyDocument has a 
>> iVar = NSMutableArray *allScenes; 
>> @property( retain ) NSMutableArray *allScenes;
>> @synthesize allScenes;
>> 
>> In my nib I have a ArrayController bound to allScenes and it is hooked up to 
>> a Table and and selected Fields, it is adding and editing my Scene Objects 
>> great.
>> 
>> I have these Saving and Loading from a Package using NSKeyArchiver, working 
>> great.
>> 
>> How do I get the [MyDocument updateChangeCount:NSChangeDone]; to be called 
>> when I add or delete a allScenes object or edit one of there properties?
> 
> You're kinda Doing It Wrong™ and your problem with updating the change count 
> is something of a side effect.
> 
> It's almost certainly wrong to expose a *mutable* array ivar as a public 
> *mutable* array property, especially when the the property is synthesized. By 
> doing this, you've allowed clients of your class to modify the property 
> non-KVO-compliantly. (For example, '[document.allScenes addObject:...]' is 
> allowed by your interface but is not compliant.) Currently it "works great", 
> I'm guessing, because currently the *only* way the array gets changed is via 
> the array controller, and the array controller brute-force-ensures KVO 
> compliance on its own accesses. (For example, it adds to the array with 
> something like '[[document mutableArrayValueForKey: @"allScenes"] 
> addObject:...]', which is compliant.) If you later add other ways of changing 
> the array, you're leaving yourself open to a compliance problem, and it's 
> likely to be an extremely hard bug to track down.
> 
> The easiest way to fix this is:
> 
> 1. Declare the property as '@property (retain) NSArray *allScenes;'.
> 
> Counter-intuitively, this won't break your array-controller-initiated 
> updates, since the array controller doesn't know the property type anyway. If 
> you read the comments for 'mutableArrayValueForKey:' in NSKeyValueCoding.h 
> carefully, you'll see that without further intervention KVC will go ahead and 
> update the mutable array anyway (case #3). But that's not what you really 
> want, so also ...
> 
> 2. Define mutable array accessors in your document subclass. Something like:
> 
>       - (void) insertObject: (id) object inAllScenesAtIndex: (NSUInteger) 
> index {
>               [allScenes insertObject: object atIndex: index];
>       }
> 
> and a similar one for removing objects. (Such methods are inherently KVO 
> compliant.) As a result, every object insertion and removal will be done via 
> your custom accessors, and -- magically -- you will now have convenient 
> places to update the document change count.
> 
> 3. If code needs to update the array property other than via KVC, you can 
> expose your custom accessors as public methods. As I said, they're inherently 
> KVO compliant, so this solves the original problem in your implementation. 
> Or, clients of the class can use 'mutableArrayValueForKey:' directly. Either 
> way, they'll be forced to do it right, and prevented from doing it wrong.
> 
> 

_______________________________________________

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