Как вы живете - фильтруйте NSArray или NSMutableArray? - PullRequest
3 голосов
/ 01 марта 2010

Я хотел бы иметь NSArray или NSMutableArray, который всегда показывает отфильтрованное представление набора данных. То есть, если фильтр настроен на «показывать вещи с буквой а» и добавлен элемент «бла», этот элемент автоматически появится в списке. Однако, если добавить «bluh», оно не будет отображаться в отфильтрованном списке (но все равно будет в базовом наборе данных).

Я вижу, что есть методы фильтрации в NSArray и NSMutableArray, но это методы одного выстрела. То есть фильтр возникает при вызове метода и никогда больше (если, конечно, вы не вызываете метод фильтра снова).

Я из мира Java, если бы я использовал Глазурованные списки для такого рода вещей. Я надеялся на подобное решение, запеченное в какао.

Ответы [ 2 ]

4 голосов
/ 01 марта 2010

Скорее всего, вы захотите использовать NSArrayController , как предложено Ole.

Вы можете использовать setFilterPredicate: на нем, как предложено, и затем вам нужно будет получить доступ к объектам, вызвав arrangedObjects на контроллере. Вам не нужно setAutomaticallyRearrangesObjects:, если только вы не собираетесь сортировать данные (используя дескрипторы сортировки & mdash; экземпляры NSSortDescriptor).

NSArrayController действительно настроен для очень простой обработки отображения элементов в табличном представлении, поэтому, если это ваша конечная цель, то это именно то, что вам нужно. Он прекрасно интегрируется с NSSearchField для обработки предикатов в пользовательском интерфейсе.

Если вы используете это как какой-то внутренний объект, который передается, тогда вы можете захотеть написать что-то немного более тяжелое, чем NSArrayController.

1 голос
/ 01 марта 2010

Исходя из iPhone, я не очень знаком с NSArrayController , но вы можете взглянуть на него. Мне кажется, что setFilterPredicate: в сочетании с setAutomaticallyRearrangesObjects:YES может помочь.

Кроме этого, довольно просто развернуть собственное решение, используя Наблюдение значения ключа . Начните с изменяемой копии массива, который вы хотите отфильтровать, и отфильтруйте его с filterUsingPredicate:, как вы отметили выше, затем зарегистрируйте себя в качестве наблюдателя для вставок и удалений в исходном массиве, и когда ваш метод наблюдателя будет вызван, вызовите evaluateWithObject: на вновь вставленных объектах, чтобы решить, вставлять ли их в ваш фильтрованный массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...