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>
>
>
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 mails | Author | Date |
|---|---|---|
| Paul Szego | Apr 3, 00:47 | |
| mmalcolm crawford | Apr 3, 03:53 | |
| Paul Szego | Apr 3, 11:31 | |
| mmalcolm crawford | Apr 3, 11:51 | |
| mmalcolm crawford | Apr 3, 11:55 | |
| Paul Szego | Apr 4, 22:13 |






Cocoa mail archive

