Рассчитать количество строк для определенных записей в NSArrayController с применением filterPredicate - PullRequest
0 голосов
/ 16 марта 2011

У меня есть простое приложение, у которого NSTableView привязан к базовому NSArrayController с поддержкой данных.

Приложение отображает все записи из основного хранилища данных в табличном представлении.

У меня есть некоторые настраиваемые пользователем фильтры, которые устанавливают предикат фильтра на NSArrayController.Это такие вещи, как фильтрация записей OUT с установленным флагом

Я хотел бы иметь панель управления, на которой перечислены метаданные о записях в основном хранилище данных, например:

общее количество записей
количество записей, где поле активно = Y
количество записей, где поле активно = N
количество записей, где поле обновлено = Y

Я бы хотел, чтобы эта информация рассчитывалась по содержаниюstore, а не видимое содержимое NSTableView.

Проблема, с которой я столкнулся, заключается в том, что на значение selectedObjects объекта NSArrayController влияет применение фильтров, поэтому такие вещи, как общее количество записей, изменяются, когдафильтры включены.

Я много гуглил и просматривал различные книги по кодированию, но не могу понять, как рассчитать эти значения таким образом, чтобы я мог связать их со значениемNSTextField в IB.

Любая помощь или предложения будут очень признательны.

С уважением

Даррен.

Ответы [ 3 ]

0 голосов
/ 16 марта 2011

Первый подкласс вашего контроллера, в данном случае NSArrayController.Во-вторых, создайте свойства на контроллере, которые представляют желаемые значения, например:

@ property (nonAtomic, retain) NSNumber * fieldActiveYes;@property (nonAtomic, retain) NSNumber * fieldActiveNo;@property (nonAtomic, retain) NSNumber * fieldChanged;

Затем создайте пользовательский метод получения для каждого свойства:

-(NSNumber *) fieldActiveYes{
    // ... perform a fetch by value on the field you wish
   //... set the fetch to return dictionaries only
   // ... use @sum collection operator to sum the fields
   return sum;
}

Привязайте значение поля пользовательского интерфейса к ключу контроллеров fieldActiveYes.Когда измененный управляемый объект изменяется, он должен пересчитать.Если нет, возможно, вам придется добавить некоторые наблюдения.

0 голосов
/ 17 марта 2011

Спасибо за ответы.

В конце концов я обнаружил, что это самое простое решение:

Я создал дополнительные NSArrayControllers в IB (по одному для каждого текстового поля) и привязал управляемый текст каждого объекта к основному модулю.

Я установил AC в режиме объекта, а затем установил FetchPredicate для каждого соответствующего условия.

В моем пользовательском интерфейсе я затем связал каждое текстовое поле с адресом selectedObjects @ соответствующего нового AC.

Привет

Даррен.

0 голосов
/ 16 марта 2011

Почему бы не создать еще один объект контроллера, который вычисляет эти значения непосредственно из стека базовых данных и предоставляет их в соответствии с требованиями KVO?

...