Несколько отфильтрованных списков на NSArrayController - PullRequest
3 голосов
/ 15 сентября 2011

Что мне нужно сделать, это просто. Скажем, у меня есть список объектов ученического домена

@implementation Student : CPObject
{
    CPString name @accessors;
    BOOL isLate @accessors;
    BOOL isMale @accessors:
}

У меня есть список этих Student объектов, хранящихся в NSMutableArray, который является частью моего модельного объекта.

У меня есть NSTableView, показывающий эти Student объекты, в таблице есть флажки для редактирования атрибутов isLate и isMale. Таблица опирается на NSArrayController, который соответствует NSMutableArray от модели.

В другом месте в интерфейсе я хочу, чтобы в двух текстовых полях отображалось «количество опоздавших учеников» и «число учеников мужского пола», и в этом моя проблема.

Поскольку NSArrayController поддерживает фильтрацию по предикату, моей первоначальной идеей было создание 3 NSArrayController объектов, по одному для представления табличного представления, для каждого агрегатного дисплея (количество поздних учеников, число учеников мужского пола). Для агрегатных контроллеров я бы применил фильтрацию и связал текстовые поля с arrangedObjects.@count. Однако это кажется неправильным подходом, поскольку главный контроллер, вносящий изменения в NSMutableArray, не сможет сообщить об изменениях, внесенных в 2 других контроллера.

Другой подход, о котором я думал, был упомянут здесь. http://cocoa -nut.de /? Тег = nsarraycontroller . Используя этот подход, я бы связал 2 «ведомых» NSArrayController, выполняющих агрегатные операции на «главном» контроллере, который поддерживает табличное представление. Однако этот подход тоже не кажется чистым.

В-третьих, я прочитал этот пост здесь: Singleton NSMutableArray, доступ к которому осуществляется NSArrayController в нескольких NIB . Это говорит о том, что вместо этого я должен переместить сложность в мой модельный объект. Возможно, мне следует создать класс StudentList с атрибутами allStudents, maleStudents, lateStudents для привязки? Это кажется излишним для чего-то такого простого.

В целом, это похоже на довольно распространенную и простую операцию в программе, но я относительно новичок в Какао, поэтому я действительно не уверен, что это «правильный» способ сделать это. Пожалуйста, просветите меня.

...