2013-02-26 20 views
9

Dizilerdeki herhangi bir yerde arama terimlerini arayan bir NSPredicate öğesini nasıl yapılandırabilirim? Tam olarak açıklayamıyorum, işte bir örnek. Ben NSString *searchText = @"Test Str Appl"; kullanırsanızNSPredicate karakterlerle eşleşiyor

NSArray *array = @[@"Test String: Apple", @"Test String: Pineapple", @"Test String: Banana"]; 
NSString *searchText = @"Apple"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText]; 
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"filteredArray: %@", filteredArray); 

// filteredArray: (
// "Test String: Apple", 
// "Test String: Pineapple" 
//) 

Ama sıfır sonuç almak. Bu dize için aynı sonuçları eşleştirmek istiyorum.

Aradığım şey, Xcode'taki "Hızlıca Aç" menüsüne benzeyen bir arama işlevidir; burada arama dizginiz doğru bir şekilde doldurulan önemli değil, yalnızca harflerin doğru sırada bir eşleşme olarak. Umarım bu mantıklıdır.

Open Quickly Menu

+1

Anlaşılan, aradığı dönem "Bulanık Eşleştirme" oldu. – squarefrog

cevap

19

yüklemler LIKE dize karşılaştırma Joker karakterler * ve ?, izin verdiğinde * maçlar 0 veya daha fazla karakter. Bu nedenle, o zaman bu

NSMutableString *searchWithWildcards = [NSMutableString stringWithFormat:@"*%@*", self.searchField.text]; 
if (searchWithWildcards.length > 3) 
    for (int i = 2; i < self.searchField.text.length * 2; i += 2) 
     [searchWithWildcards insertString:@"*" atIndex:i]; 

gibi bir şey kullanarak tüm karakterler arasında ve orijinal arama metninin sonunda, başında * ekleyerek

NSString *searchWithWildcards = @"*T*e*s*t* *S*t*r*A*p*p*l*"; 

aratacağınız metin dönüşümü eğer aralarında keyfi diğer karakterler ile, verilen sıraya göre karakterler için

[NSPredicate predicateWithFormat:@"SELF LIKE[cd] %@", searchWithWildcards]; 

yüklem aramaları kullanabilirsiniz. örneğin


dönüşüm kutu aşağıdaki kodla yapılabilecek:

NSMutableString *searchWithWildcards = [@"*" mutableCopy]; 
[searchText enumerateSubstringsInRange:NSMakeRange(0, [searchText length]) 
        options:NSStringEnumerationByComposedCharacterSequences 
       usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
        [searchWithWildcards appendString:substring]; 
        [searchWithWildcards appendString:@"*"]; 
       }]; 
+0

Bu tam olarak aradığım şey. Çok zarif bir çözüm. Teşekkür ederim. – squarefrog

+0

@squarefrog: Rica ederim. –