2012-12-21 17 views
12

İki NSString özelliği olan bir Person Nesnem var; firstName and lastName. Şu anda şöyle bir NSPredicate kullanıyorum:NSPredicate için iki dizeye nasıl eklenir, örn. Ad ve soyadı

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(firstName contains[cd] %@) OR (lastName contains[cd] %@)", searchText, searchText]; 

Yani, örneğin, adını "John Smith" arıyorum söylüyorlar. Arama çubuğumda "Joh" yazıyorsa, John Smith bir seçenek olarak görünecektir. Bu iyi ve güzel, ancak "John Sm" yazıyorsam boş kalacak. Sonra John Smith hala bir seçenek olarak görünür "John Sm" arıyordu eğer öyleyse

nasıl predicate ad ve soyad katılabilirler.

Umarım bu mantıklıdır. Teşekkürler. ,

newArray = [personObjectArray filteredArrayUsingPredicate:predicate]; 
+2

çek ben okumak ama hala Don ettik tam bilgi https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html – Deepak

+0

vermek Bunu nasıl yapacağını anlamıyorum. – Chicken

+0

Kolayca uygulayabileceğimiz sözlük veya diziyi daha iyi kullanabilirsiniz – Deepak

cevap

17

bu deneyin:

DÜZENLEME

: biraz daha fazla açıklama, ben SearchDisplayController temsilci yöntemi kullanıyorum eklemek için:

-(void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope; 

ve ben predicate gibi pek kullanıyorum

NSString *text = @"John Smi"; 
NSString *searchText = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

NSArray *array = [searchText componentsSeparatedByString:@" "]; 
NSString *firstName = searchText; 
NSString *lastName = searchText; 
NSPredicate *predicate = nil; 

if ([array count] > 1) { 
    firstName = array[0]; 
    lastName = array[1]; 
    predicate = [NSPredicate predicateWithFormat:@"(firstName CONTAINS[cd] %@ AND lastName CONTAINS[cd] %@) OR (firstName CONTAINS[cd] %@ AND lastName CONTAINS[cd] %@)", firstName, lastName, lastName, firstName]; 
} else { 
    predicate = [NSPredicate predicateWithFormat:@"firstName CONTAINS[cd] %@ OR lastName CONTAINS[cd] %@", firstName, lastName]; 
} 

NSArray *filteredArray = [people filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@", filteredArray); 

Çıkış:

( )

Burada metin aranan metinleri temsil eder. Yukarıdaki avantaj, text = @"Smi Joh"; veya text = @"John "; veya text = @" smi"; veya text = @"joh smi ";'u geçseniz bile, yine de yukarıdaki çıkışı gösterecektir.

+0

Teşekkür ederim, bir küçük sorun dışında harika çalışıyor. Ben uzay ile "john" yazarak devam ediyorum diyorum, ben soyad yazmaya başlayana kadar hiçbir sonuç görünmez, arama çubuğunda "john" ile John Smith göstermek için bir yol var mı? – Chicken

+0

Çalışmalı. Tekrar kontrol edeyim. – iDev

+1

Bu benim için de iyi çalışıyor. Bunu göndermeden önce test ettim. NSString * text = @ "john" un kaçırdığını düşünüyorum; NSString * searchText = [text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; “Filtrelemeden önce arama metniyle ikinci satırı yapmadığınızdan eminim. Temel olarak, filtreleme yaparken baştaki veya sondaki boşlukları kaldırmanız gerekir veya başarısız olur. Yani ikinci satırı kullanmazsanız, başarısız olur. – iDev

1

sen '[cd] içeriyor' kullanarak bu alanlarda filtre daha sonra iki ortak alanlara alanlar (firstLastName ve lastFirstName)

- (NSString *)firstLastName { 
     return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; 
} 

- (NSString *)lastFirstName { 
     return [NSString stringWithFormat:@"%@ %@", self.lastName, self.firstName]; 
} 

bitiştirmek edebilir

[NSPredicate predicateWithFormat:@"(firstLastName contains[cd] %@) OR (lastFirstName contains[cd] %@)" , self.searchBar.text, self.searchBar.text]; 
+0

Bu durum, coredata, bro. – Eddie

0

çözüm iradesi yukarıda önerilen iki kelimeden fazla olan arama dizeleriyle çalışmaz. İşte hızlı bir şekilde daha kapsamlı bir uygulama. Bu çözüm, bir ad üzerinde daha fazla alan eklemenize de olanak tanır. Hedefiniz ad, e-posta, telefon numarası vb. Boyunca tam metin araması gerçekleştiriyorsa. Bu durumda NSPredicate ürününü OR newField CONTAINS[cd] %@ olarak güncelleştirin ve ek $ 0 eklediğinizden emin olun. dize değiştirmeleri listesi. Burada

let searchText = search.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 
let words = searchText.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 
let predicates = words.map { NSPredicate(format: "firstName CONTAINS[cd] %@ OR lastName CONTAINS[cd] %@", $0,$0) } 

let request = NSFetchRequest() 
request.predicate = NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: predicates) 
İlgili konular