2013-01-31 13 views
5

La domanda è risolto, ecco come ho risolto in futuro per niubbi come me avevo bisogno di rimuovere i bianchi-spazi: ship.countryOfbuild = [[elements objectAtIndex:0] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];La ricerca attraverso NSMutableArray di oggetti con NSPredicate

e ho dovuto cambiare il predicato in questo modo: NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"(countryOfBuild contains[cd] %@) OR (shipBuilder contains[cd] %@) OR (name contains[cd] %@) OR (owner contains[cd] %@)",searchText, searchText, searchText, searchText];

domanda originale

sto usando this tutorial per aggiungere una barra di ricerca al mio progetto. Ho visto la vista tabella funzionante, ma la funzione di ricerca sta bloccando l'app. Il mio modo di ricerca è:

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
NSPredicate *resultPredicate = [NSPredicate 
           predicateWithFormat:@"SELF contains[cd] %@", 
           searchText]; 

searchResults = [searchContent filteredArrayUsingPredicate:resultPredicate]; 
} 

Il searchContent è un array mutabile leggere da un .csv file in questo modo:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
NSString* pathToFile = [[NSBundle mainBundle] pathForResource:@"ships" ofType: @"csv"]; 

NSString *file = [[NSString alloc] initWithContentsOfFile:pathToFile encoding: NSUTF8StringEncoding error:NULL]; 

NSArray *allLines = [file componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 


searchContent   = [[NSMutableArray alloc] init]; 


for (NSString* line in allLines) { 
    NSArray *elements = [line componentsSeparatedByString:@";"]; 

    CargoShips* ship = [[CargoShips alloc]init]; 
    ship.countryOfbuild = [elements objectAtIndex:0]; 
    ship.shipBuilder =  [elements objectAtIndex:1]; 
    ship.hullHashtag =  [elements objectAtIndex:2]; 
    ship.name =   [elements objectAtIndex:3]; 
    ship.owner =   [elements objectAtIndex:4]; 
    ship.shipOperator = [elements objectAtIndex:5]; 
    ship.shipDelivery = [elements objectAtIndex:6]; 
    ship.shipFlag =  [elements objectAtIndex:7]; 
    ship.shipClass =  [elements objectAtIndex:8]; 
    ship.powerPlant =  [elements objectAtIndex:9]; 
    ship.HP =    [elements objectAtIndex:10]; 
    ship.speed =   [elements objectAtIndex:11]; 
    ship.cargoSystem =  [elements objectAtIndex:12]; 
    ship.numberOfTanks = [elements objectAtIndex:13]; 
    ship.size =   [elements objectAtIndex:14]; 
    [self.searchContent addObject:ship]; 
} 

vorrei che la ricerca per cercare attraverso tutti i 15 pezzi del oggetto (nome, dimensione, shipclass ecc)

Attualmente, questo si blocca con l'errore:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't use in/contains operator with collection <CargoShips: 0x714e1b0> (not a collection)'

CargoShips è la mia classe NSObject.

Come si corregge NSPredicate per cercare in uno NSMutableArray oggetti senza arresto anomalo?

Ecco il codice completo se questo fa roba facile http://pastebin.com/sw12GwHK

risposta

6

Si ottiene questo errore perché una nave non è una raccolta, quindi non è possibile utilizzare contiene - Penso che sia necessario cercare un campo particolare nel proprio oggetto nave e utilizzare LIKE non CONTIENE:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.shipBuilder LIKE[cd] %@",searchText]; 

Con LIKE è possibile utilizzare i caratteri jolly nella ricerca. Puoi anche usare BEGINSWITH o ENDSWITH per cercare l'inizio o la fine delle parole.

+0

Questo è fantastico, non si blocca più atleast. Ma 1) La ricerca ritorna sempre vuota. (Nel registro e sullo schermo) e 2) Come faccio a cercare tutti i 15 campi? Grazie :) –

+0

@OscarApeland, per prima cosa devi scoprire perché questo non funziona. Devi fare un po 'di registrazione. Accedi a self.searchContent per assicurarti che contenga ciò che desideri. Quindi prova a registrare self.searchContent [0] [@ "shipBuilder"], e vedi se ciò restituisce ciò che ti aspetti. – rdelmar

+0

La registrazione di searchContent mi dà un sacco di '" ", " ", " "," cose come queste. Circa 450, la quantità di righe nella mia origine dati .csv. self.searchContent [0] [@ "shipBuilder"] Arresta l'applicazione con un '[CargoShips objectForKeyedSubscript:]: selettore non riconosciuto inviato all'istanza 0xb9e9370 2013-01-31 19: 27: 57.323 LNG [35488: c07] *** Terminazione dell'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', 'Codice errore. –

4

Non utilizzare SELF in predicato, dal momento che utilizzerà l'istanza effettiva di un Cargoship. Nel tuo esempio collegato SELF funziona bene, poiché è un NSString.

È possibile per esempio fare qualcosa di simile:

@"(countryOfBuild contains[cd] %@) OR (shipBuilder contains[cd] %@)". ecc. ecc.

+0

In questo modo, invece in questo modo: '[NSPredicate predicateWithFormat: @" (countryOfBuild contiene [cd]% @) (costruttore navale contiene [cd]% @) ", searchText];' restituisce errore: '*** Terminazione dell'app a causa di eccezione non rilevata 'NSInvalidArgumentException', motivo: 'Impossibile analizzare la stringa di formato" (countryOfBuild contiene [cd]% @) (shipBuilder contiene [cd]% @) "" Sto sbagliando/come faccio a farlo correttamente? –

+0

Scusa, ho dimenticato una parte della sintassi -> ') OR' – fguchelaar

+0

HOLY FLYING HAMSTERS FUNZIONA @! : D Grazie mille! –

3

io uso:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self.youProperty contains[c] %@", searchString]; 
searchArrayObjects = [arrayObjects filteredArrayUsingPredicate:resultPredicate]; 

Links to documentation

+0

Questa domanda ha più di un anno, l'ho risolta molto tempo fa, ma grazie: P –

Problemi correlati