Skip navigation.
 
mlRe: Controlling bindings with code
FROM : Christiaan Hofman
DATE : Wed Mar 26 11:27:06 2008

Maybe I completely misunderstand you. But when you unbind the 
contentSet, why should it display anything? The full contents of 
*which* arrangedObjects? The arrangedObjects are *derived* from the 
contentSet, so not contentSet means no arrangedObjects. I really fail 
to see the "filtering" in this story, becaue you haven't said a word 
about filters, even though you keep mentioning filtering. The 
contentSet binding has nothing to do with filtering.

Christiaan

On 26 Mar 2008, at 9:12 AM, Trent Jacobs wrote:

> Thanks Christiaan.
>
> Why would I expect the filtering to be removed when I unbind? My 
> understanding is that when an array controller's content is 
> contained in the arrangedObjects, and that this content is further 
> filtered if the array controller's 'Content Set' is bound to another 
> array controller. So I assumed when the binding to the content set 
> is removed the full contents of the arrangedObjects would be shown. 
> Is this incorrect?
>


Your understanding is wrong. Actually, none of the statements you make 
here is correct. The contentSet has nothing to do with filtering, 
that's done by the filter predicates.

> (as a possible clarification, I'm unbinding the content set, not the 
> arranged objects.)


I think you misunderstand something about bindings in 
NSArrayController, arrangedObjects is not a key you can bind (you can 
only bind *to* that key), those are generated by NSArrayController 
from whatever its content is. The content can be provided by binding 
either contentSet or contentArray (not both, the result is undefined).

>
>
> As for filter predicates... I thought doing it the way I described 
> below was the proper way since it would mean less code and more 
> reliance on binding. I guess I was wrong?  :)
>
> Trent.
>


Yes (for the last sentence).

Here's how NSArrayController works:

- You provide the full content of the objects handled by 
NSArrayController by binding either contentSet or contentArray.
- NSArrayController filters these objects according to the 
filterPredicate (either set or provided through binding) and sorts 
them according to the sortDescriptors (either set or provided through 
binding).
- arrangedObjects is the *result* of this procedure. You can read it 
in code or bind something else to it.

Christiaan

> Christiaan Hofman wrote:

>>
>> On 25 Mar 2008, at 9:15 PM, Trent Jacobs wrote:
>>

>>> The app I'm writing is centered around a particular list of 
>>> objects (for example a list of items in a shop) with various 
>>> filters allowed. it's a core data app and I'm using bindings 
>>> wherever possible.
>>>
>>> In the model I'm using I have an entity for my objects and I've 
>>> set up relationships to the entities I'll be filtering on (for 
>>> example brand, colour, whatever).
>>>
>>> I've got everything with perfectly when I hook up the bindings in 
>>> IB, i.e. when I select a brand the list of objects is filtered to 
>>> only show objects of the selected brand. However, when I try to do 
>>> the bindings in code it doesn't work.
>>>
>>> To create the bindings I use:
>>>
>>>        [myObjectController bind : @"contentSet"
>>>                      toObject : filterController
>>>                    withKeyPath : @"selection.objects"
>>>                        options : nil];
>>>
>>> where myObjectController and filterController are 
>>> NSArrayController objects and selection.objects represents the 
>>> relationship in the model.
>>>
>>> This works fine. However, when I remove the contentset binding I 
>>> would expect the filtering to be removed.

>>
>> Why? The -unbind: method does not trigger a reload, -
>> bind:toObject:withKeyPath:options: however does. This does make 
>> sense to me.
>>

>>> This doesn't happen. What happens is that the list of objects 
>>> stays the same although the controlling relationship to the 
>>> filtering array controller is gone, i.e. I change brands and the 
>>> list stays constant. To remove the bindings I am simply using:
>>>
>>>        [myObjectController unbind : @"contentSet"];
>>>
>>> I think this is happening because the NSArrayController is not 
>>> being told to refresh but i can't find how to force a refresh.
>>>

>>
>> -rearrangeObjects could do it. Or binding to some other property.
>>

>>> Any ideas?
>>>
>>> Thanks!

>>
>> Why aren't you just using filter predicates?
>>
>> Christiaan
>>

Related mailsAuthorDate
mlControlling bindings with code Trent Jacobs Mar 25, 21:15
mlRe: Controlling bindings with code Christiaan Hofman Mar 25, 23:58
mlRe: Controlling bindings with code Trent Jacobs Mar 26, 09:12
mlRe: Controlling bindings with code Christiaan Hofman Mar 26, 11:27
mlRe: Controlling bindings with code Trent Jacobs Mar 26, 12:00