Skip navigation.
 
mlRe: insertObject:in<Key>AtIndex: not being called.
FROM : Paul Szego
DATE : Sun Apr 03 11:31:45 2005

Ok - so the bottom line seems to be: if you're wanting KVC write 
access, you have to know whether you're dealing with a to-many 
property. In that case, use mutableArrayValueForKeyPath: instead of 
just setValue:forKey: to cater for the situation where indexed 
accessors are provided.

Which leads to me next question about bindings, which I've posted 
elsewhere. If I bind a to-many property that's providing indexed 
accessors, the default bind: behaviour provided in NSObject tries to 
call setValue:forKey: instead of using mutableArrayValueForKeyPath:, 
and so I get a "not KVC compliant" error message. Is this what should 
happen?

Thanks, Paul.

On 03/04/2005, at 1:53 PM, mmalcolm crawford wrote:

>
> On Apr 2, 2005, at 2:47 PM, Paul Szego wrote:
>

>> I can't get KVC working for to-many relationships when I don't expose 
>> the NSMutableArray directly. If I provide the following indexed 
>> accessors (for a property named "items"), it doesn't work:
>> -countOfItems and -objectInItemsAtIndex:
>> -insertObject:inItemsAtIndex: and -removeObjectFromItemsAtIndex:
>> If I make the "items" attribute public, or provide get/set methods, 
>> things work. According to the documents however, this class *is* KVC 
>> compliant. In that case, I should be able to use valueForKey: and 
>> setValue:forKey: for this property.
>>

> The documentation is a little misleading or inconsistent (I've filed a 
> bug report -- and another for the misleading error report), however 
> the description for setValue:forKey: 
> (<http://developer.apple.com/documentation/Cocoa/Reference/Foundation/

> ObjC_classic/Protocols/NSKeyValueCoding.html>) is explicit about what 
> methods you must implement for it to work -- i.e. you must implement a 
> set<Key>: method or allow access to an appropriately-named instance 
> variable.
>
> If you have only implemented -countOfItems, -objectInItemsAtIndex:, 
> -insertObject:inItemsAtIndex:, and -removeObjectFromItemsAtIndex:, 
> then your class *is* KVC compliant, however the NSKeyValueCoding 
> accessor for the collection is mutableArrayValueForKey: ...
>

>> "Implementing indexed accessors methods for a property makes that 
>> property indistinguishable from an array when using key-value coding 
>> methods."

>
> The documentation does go on to say,
>
> "Implementing [countOfTransactions and objectInTransactionsAtIndex:] 
> allows your application to invoke valueForKey: using the key for the 
> to-many property. An array containing the objects in the relationship 
> is returned.
> [...]
> The key-value coding methods mutableArrayValueForKey: and 
> mutableArrayValueForKeyPath: provide mutable access to a to-many 
> relationship..."
>
>
> mmalc
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Cocoa-dev mailing list      (<email_removed>)
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/cocoa-dev/
> paul.<email_removed>
>
> This email sent to paul.<email_removed>
>
>

Related mailsAuthorDate
mlinsertObject:in<Key>AtIndex: not being called. Paul Szego Apr 3, 00:47
mlRe: insertObject:in<Key>AtIndex: not being called. mmalcolm crawford Apr 3, 03:53
mlRe: insertObject:in<Key>AtIndex: not being called. Paul Szego Apr 3, 11:31
mlRe: insertObject:in<Key>AtIndex: not being called. mmalcolm crawford Apr 3, 11:51
mlRe: insertObject:in<Key>AtIndex: not being called. mmalcolm crawford Apr 3, 11:55
mlRe: insertObject:in<Key>AtIndex: not being called. Paul Szego Apr 4, 22:13