2014-09-03 23 views
11

Birden çok koşullu bir NSPredicate oluşturmaya çalışıyorum. Birkaç çözüm buldum, ancak bunların hiçbiri benim yöntemimle çalışmıyor gibi görünmüyor. Bulduğum en güzel şey aşağıda.NSP Birden Fazla Koşul ile Rapor Oluşturun

Bu benim tek yüklem yöntemdir ve gayet güzel çalışıyor:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", 
searchText]; 
filteredBusinesses = [businesses filteredArrayUsingPredicate:predicate]; 

Burada birden koşullarla benim düzenlenmiş sürümüdür. Neyin yanlış gittiğinden emin değilim. Herhangi bir fikir?

NSPredicate *p1 = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"businessArea contains[c] %@", 
searchText]; 

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1, p2]]; 
filteredBusinesses = [businesses filteredArrayUsingPredicate:predicate]; 
+0

Ne bekliyor ve ne gibi bağımsız Alıyorsun? – bhargavg

+0

Arama bilgi kartımdaki birden fazla bilgi türünü yazmayı beklerdim. Bunun yerine, çökmesini :( – Brandon

+1

stacktrace'i yapıştırın – bhargavg

cevap

12

Bu

deneyebilirsiniz
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[p1, p2]]; 
+0

çivilenmiş !!! Çok teşekkürler! – Brandon

+0

... bir 'veya' yüklemi bir 've' yüklemi ile aynı şey değildir. –

1

Hiçbir şey hata muhtemelen dizi filtreleyerek yüklemi değerlendirirken geliyor demektir deftere kodu, yanlış görünüyor.

İlk yüklemeden sonra sorun, businessArea anahtar yolunda yatar.

eğer bir istisna olur diziyi Filtreleme:

  1. (bu bir -businessArea yöntemi vardır bir nesne değil gibi) bir businessArea değeri yoktur dizide bir nesne var nesne businessArea değeri var, ama değer ne bir NSString ne de nil
7

@ Nikunj'ın yanıtına ek olarak, bu şekilde AND işlemleriniz için NSCompoundPredicate özelliğini de kullanabilirsiniz.

Obj C - VE

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"]; 
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"]; 
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2]]; 

Swift - VE

let predicate1:NSPredicate = NSPredicate(format: "X == 1") 
let predicate2:NSPredicate = NSPredicate(format: "Y == 2") 
let predicate:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1,predicate2]) 

Swift 3 - VE

let predicate1 = NSPredicate(format: "X == 1") 
    let predicate2 = NSPredicate(format: "Y == 2") 
    let predicateCompound = NSCompoundPredicate.init(type: .and, subpredicates: [predicate1,predicate2]) 
İlgili konular