2017-06-07 4 views

Répondre

0

Une solution possible consiste à utiliser une expression régulière pour cela. Nous avons juste besoin d'insérer .* entre chaque lettre (et avant et après la chaîne) qui signifie "n'importe quel caractère (sauf pour les terminaisons de ligne)". Il semble que c'est ce qui est utilisé pour la recherche sur l'achèvement de XCode.

NSMutableArray *letters = [[NSMutableArray alloc] init]; 
[searchString enumerateSubstringsInRange:NSMakeRange(0, [searchString length]) 
           options:NSStringEnumerationByComposedCharacterSequences 
           usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) { 
    [letters addObject:substring]; 
}]; 
NSMutableString *pattern = [[NSMutableString alloc] initWithString:@".*"]; 
[pattern appendString:[letters componentsJoinedByString:@".*"]]; 
[pattern appendString:@".*"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.%K MATCHES[C] %@", keyToFilter, pattern]; 

échantillon à jouer, insérer juste avant:

NSString *keyToFilter = @"attribute"; 
NSArray *array = @[@{keyToFilter:@"UITextField"}, @{keyToFilter:@"nsarray"}, @{keyToFilter:@"uitf"}]; 
NSString *searchString = @"uitf"; 

et juste après:

NSArray *filtered = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"SearchString: %@\nFiltered: %@", searchString, ([filtered count]?[filtered valueForKey:keyToFilter]:@"NO RESULT")); 

sortie:

$>SearchString: uitf 
Filtered: (
    UITextField, 
    uitf 
) 

Le code pris pour la construction du réseau de Les lettres proviennent du here. Différentes solutions auraient pu être utilisées pour créer pattern, ce n'est peut-être pas la meilleure, mais c'est une solution de travail.

Bonus:

Et pour le plaisir (j'étais intrigante sur la façon de le faire), d'une manière possible de colorer la liste (j'ai fait un tableau de NSAttributedString) pour adapter (non vérifié ou erreurs gratuit) :

NSMutableArray *filteredColored = [[NSMutableArray alloc] init]; 
for (NSDictionary *aDict in filtered) //or for (MyObjectClass *myObject in filtered) 
{ 
    NSString *aFilteredValue = aDict[keyToFilter]; //or NSString *aFilteredValue = [myObject attribute] 
    NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:aFilteredValue attributes:@{}]; 
    NSInteger currentIndex = 0; 
    for (NSString *aLetter in letters) 
    { 
     NSRange rangeFound = [aFilteredValue rangeOfString:aLetter 
                options:NSCaseInsensitiveSearch 
                range:NSMakeRange(currentIndex, [aFilteredValue length]-currentIndex)]; 
     if (rangeFound.location != NSNotFound) 
     { 
      currentIndex = rangeFound.location+rangeFound.length; 
      [attr addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:rangeFound]; 
     } 
    } 
    [filteredColored addObject:attr]; 
}