2016-05-19 4 views
0

Hier ist mein Test zum Filtern des Arrays durch eine Zeichenfolge. Es funktioniert gut, wenn meine Zeichenfolge nicht enthält (') ZeichenNSPredate zum Filtern von Array mit (') Zeichen Problem

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil]; 

    //NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"]; -> it work 
    NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b''"]; -> it crash 
    NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate]; 
    NSLog(@"beginwithB = %@",beginWithB); 

Ich versuche auch, meine Zeichenfolge 'b\'' oder 'b''' aber noch

Hier Absturz zu ändern, ist das Crash-Protokoll

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "SELF contains[c] 'b'''"'

Wie löst man es? Jede Hilfe wäre sehr geschätzt.

+0

Vielleicht helfen, aber 'contains' klingt wie ein schlechter Kandidat für ein Prädikat, dessen Ergebnisse genannt werden' beginWith ... ' – Alladinian

+0

@Alladinian ja, es ist nur mein Test, ich kopiere diesen Code nur von http://Stackoverflow.com/a/25738783/5381331. Danke für Sie Korrektur –

Antwort

2

Bitte versuchen Sie es Ergebnis zu filtern, wie folgt:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil]; 
     NSString *strToBeSearched = @"b'"; 

     //NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"]; -> it work 

     NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",strToBeSearched]; //-> it also work 

     //OR 

     NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b\\''"]; 


     NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate]; 
     NSLog(@"containB = %@",beginWithB); 
+0

diese Arbeit. danke –

+0

@ PhanVănLinh Willkommen :-) – Microprocessor8085

2

versuchen, diese

NSString *searchword = @"b"; 
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchword]; 

Sie Ausgabe von Get

enter image description here

+0

Wenn Sie die excat Antwort verwenden möchten dasaskblinkknight Antwort, sonst versuchen Sie meine Antwort –

+0

Sie bieten eine korrekte Lösung, aber die Art, wie Sie mir zeigen, ist nicht sehr gut. weil ich nach der Zeichenkette frage, die ein (') Zeichen enthält, aber in deinem Test deine Zeichenkette nicht enthält ('). trotzdem vielen Dank für die richtige Lösung;) –

1

Sie waren ziemlich nah dran, wenn Sie Backslash versucht. Dies ist das Zeichen, das NSPredicate verwendet, um Sonderzeichen zu umgehen. Sie benötigen jedoch zwei, nicht einen umgekehrten Schrägstrich:

Der Grund, warum Sie zwei benötigen, ist Objective-C-Compiler. Es verarbeitet alle Zeichenfolgenliterale in Ihrem Code und ersetzt die gefundenen Escape-Sequenzen. Wenn Sie möchten, dass NSPredicate einen einzelnen Backslash anzeigt, muss das Zeichenfolgenliteral zwei Backslashes haben, da der Backslash selbst in Objective-C-Zeichenfolgenliteralen als \\ codiert ist.

+0

add '\\' Arbeit. Vielen Dank –

0

Wenn Ihr Name dann b'en ist,

NSString *name = @"b'en"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == \"%@\"", name]; 

Hope this irrelevant :)

+0

es mit dem Fehler abstürzen: 'Diese Klasse ist nicht Schlüssel-Code-kompatibel für den Schlüsselnamen. ''. Ich habe die Lösung gefunden. danke für deine Hilfe –

+0

du bist willkommen ... :) – Lion