2014-09-03 72 views
11

我正尝试创建一个具有多个条件的NSPredicate。我发现了几种解决方案,但他们都没有用我的方法。下面是我找到的最漂亮的一个。具有多个条件的NSPredicate

这是我的一个判断方法,它工作得很好:

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

这里是我的编辑过的版本有多个条件。我不知道发生了什么问题。有任何想法吗?

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

你在期待什么是你得到了吗? – bhargavg 2014-09-03 04:00:30

+0

我曾期待能够将多种类型的信息输入到我的searchbarlelegage中。相反,它崩溃:( – Brandon 2014-09-03 04:03:48

+1

粘贴你的堆栈跟踪 – bhargavg 2014-09-03 04:05:20

回答

12

你可以试试这个

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

钉了!!! !!!非常感谢! – Brandon 2014-09-03 05:10:27

+0

...一个'或'谓语与'和'谓语不一样。 – 2014-09-03 16:37:32

1

在您发布的代码中没有看起来错误,这意味着错误可能来自您通过过滤数组来评估谓词。

由于第一个谓词起作用,问题在于关键路径businessArea

过滤所述阵列将抛出异常,如果:

  1. 有数组中的一个对象,该对象不具有businessArea值(如在,它不是具有-businessArea方法的对象)
  2. 对象确实有businessArea价值,但价值既不是NSString也不nil
7

除了@ Nikunj的回答,您还可以使用NSCompoundPredicate来处理您的AND操作。

对象 - - 和

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

斯威夫特 - 和

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

斯威夫特3 - 和

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