2010-12-18 9 views
12

Ist es möglich, ein existierendes NSPredicate zu nehmen und ein zusätzliches Argument hinzuzufügen?Zusätzliches Argument zu einem vorhandenen NSPredicate hinzufügen

In einem meinem Tableviews ich in einem NSPredicate ist vorbei zu verwenden, in meinen NSFetchedResultsController wie so:

[fetchedResults setPredicate:self.predicate]; 

Das funktioniert ganz gut und zeigt den Inhalt auf der Grundlage der bestehenden NSPredicate. Aber ich möchte einen Schritt weiter gehen, indem ich ein UISegmentedControl zum TableView hinzufüge.

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

Basierend auf dem Segment, das der Benutzer ausgewählt hat, möchte ich ein Argument zum vorhandenen NSPredate hinzufügen. Ist das überhaupt möglich?

Antwort

39

Sicher!

Lasst uns sagen, dass Ihre Objekte eine Eigenschaft namens haben display, die ein int ist (oder besser gesagt, eine Enumeration, die kDisplayDVD, kDisplayVHS usw. entspricht Ihrer). Dann können Sie tun:

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

Also, wenn [self predicate](foo = @"bar" OR baz > 42) ist, Ihr neues Prädikat display = 1 AND (foo = @"bar" OR baz > 42)

+1

funktioniert perfekt. Vielen Dank, hatte keine Ahnung von SubPredicates. – avenged

+1

@avenged du bist sehr willkommen! 'NSPredate' ist eines meiner Lieblingsdinge in Foundation.framework :) –