On 2010 Apr 02, Quincey Morris wrote:

> I only see 4 distinct keys in your list below, since one of them is 
> duplicated.

Yes, you're correct.  There are only 4.

> I'm suspicious of the "fooArrayController" part. Is it *just* an instance 
> variable?

It's an IBOutlet, and also there is a getter which returns the IBOutlet.

> If so, then it gets to be a property only by virtue 
> 'accessInstanceVariablesDirectly' being YES (which is bad magic, but a 
> different story). If so, then it's not KVO compliant, though the only 
> scenario I can think of where this would cause keyPathsForValuesAffecting... 
> to fail is if something was already observing "selectedFoo" before the nib 
> file containing it was loaded.

There is something else observing "selectedFoo", and it is in the nib, another 
"detail" array controller, to which is bound a table which displays the 'bars', 
shall we say, of the 'selectedFoo'.

So you're telling me that all of the keys in a key path must be KVO-compliant.  
I hadn't thought so, because in the key path "fooArrayController.selection", 
the fooArrayController is hard-wired to an IBOutlet and never changes.  But now 
I see a possible explanation is that the Cocoa Bindings Wizard created its 
observer before the fooArrayController got wired to its outlet.

On 2010 Apr 02, Kyle Sluder wrote:

> Because +keyPathsForValuesAffectingValueForKey relies on 
> NSKeyValueObservingOptionPrior, which NSArrayController doesn't support.

That would explain the problem also.

So the answer is either Quincey's explanation, or this bug, or both.

> File a bug. It'll get dup'ed, but do it anyway.

If I don't hear more from you on this, Kyle, I'll test and file a bug tomorrow.


Other Details...

On 2010 Apr 02, Quincey Morris wrote:

> TBH, if I had a reason to want to observe the selection 
> (keyPathsForValuesAffecting... being a special case of that), I'd create a 
> real NSIndexSet* selectedItemIndexes property of my own, bind the array 
> controller's "selectionIndexes" binding to that (so that the array controller 
> maintains the real property for me), and then observe the real property, 
> leaving all reference to the array controller itself out of my code.

Yes, that seems like it would work.

>> I solved the problem by eliminating all this code and binding my button's 
>> 'enabled' binding instead to the array controller's 'selection' and, to my 
>> surprise, it worked.  My surprise is because, according to superclass 
>> NSObjectController documentation, 'selection' returns NSNoSelectionMarker 
>> when there is no selection, not nil which is what my NSIsNotNil value 
>> transformer would expect.
> 
> I think the answer is that it works because it's a frameworks binding, and 
> frameworks bindings are very clever in ways we aren't actually told about. It 
> probably knows whether it's allowed to pass on the marker value, or if it 
> must convert the marker to some kind of "real" object first -- hence nil. Or 
> perhaps passing NSNoSelectionMarker to the value transformer is simply 
> special-cased somewhere.

That's what I was afraid of.

_______________________________________________

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