Фильтрация Используя пользовательский контроллер массива

Эта статья объясняет, как использовать поле поиска и пользовательский контроллер массива для фильтрации набора объектов. Несмотря на то, что Вы обычно используете поле поиска в сочетании с табличным представлением для реализации этого стиля интерфейса, задачи, обсужденные в этой статье, не ограничиваются этими компонентами.

Переопределение arrangeObjects:

arrangeObjects: метод сортирует содержание контроллера массива с помощью текущих дескрипторов вида. Для ограничения выведенного на экран содержания подмножеством содержания, необходимо переопределить arrangeObjects:, создайте новый массив, содержащий подмножество, и затем вызовите реализацию суперкласса arrangeObjects: обеспечить любую надлежащую сортировку.

arrangeObjects: реализация в Перечислении 1 выполняет привязанный поиск свойства заголовка. В привязанном поиске, только те объекты, свойство заголовка которых соответствует searchString добавляются к возвращенному массиву.

Перечисление 1  , Фильтрующее реализацию arrangeObjects:

- (NSArray *)arrangeObjects:(NSArray *)objects {
 
    if (searchString == nil) {
        return [super arrangeObjects:objects];
    }
 
    NSMutableArray *filteredObjects = [NSMutableArray arrayWithCapacity:[objects count]];
    NSEnumerator *objectsEnumerator = [objects objectEnumerator];
    id item;
 
    while (item = [objectsEnumerator nextObject]) {
        if ([[item valueForKeyPath:@"title"] rangeOfString:searchString options:NSAnchoredSearch].location != NSNotFound) {
            [filteredObjects addObject:item];
        }
    }
    return [super arrangeObjects:filteredObjects];
}

Обновление строки поиска

Вы реализуете search: метод действия вызвать rearrangeObjects, который инициировал вызов arrangeObjects: метод.

Перечисление 2 показывает реализацию поиска: действие. searchString установлен в строковое значение sender объект, и rearrangeObjects вызывается.

Перечисление 2  , Обновляющее searchString

- (void)search:(id)sender {
    // set the search string by getting the stringValue
    // from the sender
    [self setSearchString:[sender stringValue]];
    [self rearrangeObjects];
}
 
 
- (void)setSearchString:(NSString *)aString
{
    [aString retain];
    [searchString release];
    searchString=aString;
}
 
@end

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