Добавьте дополнительный аргумент в существующий NSPredicate

Можно ли взять существующий NSPredicate и добавить к нему дополнительный аргумент?

В одном из моих табличных представлений я передаю NSPredicate для использования в моем NSFetchedResultsController, например:

[fetchedResults setPredicate:self.predicate];

Это прекрасно работает и покажет контент на основе существующего NSPredicate. Но я хочу сделать еще один шаг, добавив UISegmentedControl в tableView.

- (IBAction)segmentChange:(id)sender {
     switch (selectedSegment) {
            case kDisplayDVD:
                // Add argument to existing NSPredicate
                break;
            case kDisplayVHS:
                // Add argument to existing NSPredicate
                break;
            default:
                break;
        }

В зависимости от того, какой сегмент выбран пользователем, я хотел бы добавить аргумент в существующий NSPredicate. Возможно ли это?

Ответ 1

Конечно!

Скажем, что ваши объекты имеют свойство display, что int (или, вернее, перечисление, соответствующее вашим kDisplayDVD, kDisplayVHS и т.д.). Затем вы можете сделать:

- (IBAction) segmentChange:(id)sender {
  NSPredicate * newCondition = [NSPredicate predicateWithFormat:@"display = %d", selectedSegment];
  NSPredicate * newPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:[self predicate], newCondition, nil]];
  [self setPredicate:newPredicate];
}

Итак, если [self predicate] - (foo = @"bar" OR baz > 42), ваш новый предикат будет display = 1 AND (foo = @"bar" OR baz > 42)