2010-03-01 4 views
3

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

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

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

ответ

4

Вы, скорее всего, захотите использовать NSArrayController, как полагает Оле.

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

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

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

1

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

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

Смежные вопросы