2

Diese Frage aus der gleichen app/Quelle aus meiner vorherigen Frage basiert, die hier gefunden werden kann:Mit NSPredicate in 2D-Arrays

How to manage memory using classes in Objective-C?

ich eine verschachtelte Array haben, die, wenn sie gedruckt ungefähr so ​​aussieht (Ich habe nur einen kurzen Teil davon kopiert und eingefügt).

(
     (
     <Term: 0x4256420>, 
     <Term: 0x420fa40>, 
     <Term: 0x4257bd0>, 
     <Term: 0x4257cf0>, 
     <Term: 0x4257d90>, 
     <Term: 0x4257e30> 
    ), 
     (
     <Term: 0x4257e50>, 
     <Term: 0x4257f90>, 
     <Term: 0x4257fb0>, 
     <Term: 0x42580e0>, 
     <Term: 0x4258170>, 
     <Term: 0x4258210>, 
     <Term: 0x4258230>, 
     <Term: 0x4258360>, 
     <Term: 0x4258400>, 
     <Term: 0x42584a0>, 
     <Term: 0x4258540>, 
     <Term: 0x42585e0>, 
     <Term: 0x4258670>, 
     <Term: 0x4258710> 
    ), 

Und hier ist mein Code für die Suche ein Teil meiner Tabelle:

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Normal table 
    if (aTableView == self.tableView) return [[self.sectionArray objectAtIndex:section] count]; 

    // Search table 
    //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text]; 
    //self.filteredArray = [self.crayonColors filteredArrayUsingPredicate:predicate]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text]; 
    self.filteredArray = [[self.sectionArray objectAtIndex:section] filteredArrayUsingPredicate:predicate]; 


    return self.filteredArray.count; 
} 

Ich erhalte den Fehler, dass ich nicht genug Platz zuweisen kann, was bedeutet, dass ich etwas falsch machen müssen, ich habe gerade kann nicht herausfinden, was.

Der auskommentierte Teil des Suchteils in der obigen Methode funktioniert, aber CrayonColors ist nur ein einfaches NSMutableDictionary von NSStrings und hat keine eingebetteten Arrays.

Vielen Dank im Voraus!

+0

Vermutlich hat ein 'Term'-Objekt eine name-Eigenschaft. Meine Frage ist: "Was versuchst du zu erreichen?" Sie haben ein Array von Arrays von Objekten, aber was versuchen Sie daraus zu machen? (Mit welchen Objekten möchten Sie enden?) –

+0

So hat AbschnittArray dieses geschachtelte Array von Term-Objekten. Mit NSPredicate versuche ich nach der Person zu suchen, die in der Suchleiste eingegeben wurde. Das heißt also, wenn man 'A' eintippt, möchte ich, was immer ein 'A' enthält. Ich versuche, diese Term-Objekte in das filteredArray zu bekommen. – Flipper

+0

aber wollen Sie sie in einem einzigen Array, oder möchten Sie ein Array von gefilterten Arrays? Oder etwas anderes? –

Antwort

11

Soweit mir bekannt ist, können Sie dies nicht mit einem einzigen Prädikat tun. Sie können dies jedoch mit einem Schlüsselpfadoperator und einem Prädikat in zwei separaten Aufrufen tun.

Sie haben also eine Reihe von Arrays von Begriffen. Sie möchten ein einzelnes Array von Begriffen, dessen Name beispielsweise 'A' enthält. Hier ist was Sie tun:

NSArray * allTerms = ...; //your array of arrays of terms 
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"]; 

NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"]; 
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter]; 

Die Magie hier ist die valueForKeyPath: Bit. Die @unionOfArrays operator nimmt ein Array von Arrays von Objekten und gibt ein Array von Objekten zurück. Hier ist, was es tut: Die NSArray wird den Schlüsselpfad um . aufbrechen, geben es @unionOfArrays und self. Es wird reccurse und valueForKeyPath: auf sich selbst mit dem zweiten Bit (self) aufrufen, und es wird ein Array von Arrays zurück. Es wird dann alle diese Arrays zu einem einzigen Array zusammenbrechen und Duplikate ignorieren. (Wenn Sie Duplikate entfernen möchten, verwenden Sie stattdessen @distinctUnionOfArrays)

Sobald wir das Array von Objekten haben, können wir es dann filtern normalerweise ein einfaches name CONTAINS 'blah' Prädikat verwendet wird.

(Ich dachte, ich könnte in der Lage sein, dies ein SUBQUERY mit zur Arbeit zu kommen, aber das ist ein seltsames Tier und nichts war mir sofort klar.)

Für den Super unerschrockenen, können Sie dies mit einem einzigen tun könnten Methodenaufruf mit den Sammelerweiterungen von KickingBear (available here), aber ich würde dringend davon abraten, solche Hacks in einer Produktionsumgebung zu verwenden. :)

+8

Eine Randnotiz: Wenn Ihre Arrays Wörterbücher enthalten, müssen Sie den Schlüsselpfad in '@ unionOfArrays. @ Self 'ändern, da im ursprünglichen Schlüsselpfad' @unionOfArrays.Selbst, wird der "Selbst" -Teil als ein Schlüssel zum Abrufen von Objekten aus Ihren Wörterbüchern interpretiert ... – albertamg

+1

@albertamg Danke für den Tipp mit Wörterbüchern! Du hast mir eine Stunde Kopfkratzen erspart. – mkko

+1

@albertamg & Dave Delong ihr habt mir eine Menge Zeit erspart. Vielen Dank! – Jeremy