2010-12-18 19 views
12

¿Es posible tomar un NSPredicate existente y agregarle un argumento adicional?Agregue argumento adicional a un NSPredicate existente

En una de mis tableviews estoy pasando un NSPredicate a utilizar en mi NSFetchedResultsController así:

[fetchedResults setPredicate:self.predicate]; 

Esto está funcionando muy bien y mostrará el contenido basado en la NSPredicate existente. Pero quiero dar un paso más al agregar un UISegmentedControl a 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; 
     } 

Según el segmento que el usuario ha elegido, me gustaría agregar un argumento al NSPredicate existente. ¿Es esto posible?

Respuesta

39

Sure!

Digamos que sus objetos tienen una propiedad llamada display que es una int (o más bien, una enumeración que corresponde a su kDisplayDVD, kDisplayVHS, etc.). A continuación, puede hacer:

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

Así que si es [self predicate](foo = @"bar" OR baz > 42), su nuevo predicado será display = 1 AND (foo = @"bar" OR baz > 42)

+1

funciona perfecto. Muchas gracias, no tenía idea sobre subPredicates. – avenged

+1

@avenged eres bienvenido! 'NSPredicate' es una de mis cosas favoritas en Foundation.framework :) –

Cuestiones relacionadas