2009-10-06 6 views
4

Dans l'un des exemples de code d'Apple, ils donnent un exemple de recherche:recherche est que les mots correspondants au début

for (Person *person in personsOfInterest) 
{ 
    NSComparisonResult nameResult = [person.name compare:searchText 
      options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) 
      range:NSMakeRange(0, [searchText length])]; 

    if (nameResult == NSOrderedSame) 
    { 
     [self.filteredListContent addObject:person]; 
    } 
} 

Malheureusement, cette recherche ne correspondra le texte au début. Si vous cherchez "John", cela correspondra à "John Smith" et "Johnny Rotten" mais pas à "John Peach" ou "John".

Y at-il un moyen de le changer afin qu'il trouve le texte de recherche n'importe où dans le nom? Merci.

Répondre

6

Essayez d'utiliser rangeOfString:options: à la place:

for (Person *person in personsOfInterest) { 
    NSRange r = [person.name rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)]; 

    if (r.location != NSNotFound) 
    { 
      [self.filteredListContent addObject:person]; 
    } 
} 

Une autre façon que vous pouvez y arriver est en utilisant un NSPredicate:

NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText]; 
//the c and d options are for case and diacritic insensitivity 
//now you have to do some dancing, because it looks like self.filteredListContent is an NSMutableArray: 
self.filteredListContent = [[[personsOfInterest filteredArrayUsingPredicate:namePredicate] mutableCopy] autorelease]; 


//OR YOU CAN DO THIS: 
[self.filteredListContent addObjectsFromArray:[personsOfInterest filteredArrayUsingPredicate:namePredicate]]; 
+0

en utilisant NSPredicate. – pxl

+0

Fonctionne parfaitement, merci. J'ai fini par utiliser 'rangeOfString: options' puisque je compare avec plusieurs champs (person.firstName, person.lastName). –

+1

@nevan vous pouvez mettre plusieurs comparaisons à l'intérieur d'un prédicat; il est à peu près équivalent à une clause WHERE sql: '[NSPredicate predicateWithFormat: @" nom CONTAINS [cd]% @ OR nom de famille CONTAINS [cd]% @ ", searchText, searchText];' –

1

-[NSString rangeOfString:options:] et les amis sont ce que vous voulez. Il retourne:

« Une structure NSRange donnant la position et la longueur dans le récepteur de la première occurrence de aString, modulo les options de masque Retourne {NSNotFound, 0} si aString est introuvable ou est vide (@""). ».

Questions connexes