使用谓词在结果中搜索

时间:2015-01-06 19:48:53

标签: core-data swift ios8 nspredicate

我有一个创建汽车的核心数据模型,我想选择其中一种车型PLUS中的任何一种不同的颜色这就是我想要做的事情:

选择ViewController

1)选择汽车类型(轿车,轿跑车,SUV,混合动力车)(我设想一个分段控制来将其设置为谓词)

2)一旦选择了车辆类型,我就喜欢从颜色列表中选择仅显示满足我在车辆中选择的车辆类型的车辆第一步。例如,我想只显示(红色,绿色和蓝色)SUV或仅显示黑色和白色的混合动力车。

结果TableViewController

3)一旦选择了这些,我想把它们转移到另一个TVC上。

这篇文章有点帮助,但有人问这个问题试图找到不同的项目(例如:A,B和C)。我试图找到X,Y& Z只在A内。 Can I apply multiple predicates to an NSFetchRequest? Would it be better to manually parse my results?

当我尝试检索一种类型的车辆加上所选颜色列表时,我遇到了麻烦

let vehiclePredicate = NSPredicate(format: "type == %@", "(one of sedan/coupe/SUV/hybrid)")

以下任何一项标准

let colorRedPredicate = NSPredicate(format: "color == %@", "red")
let colorGreenPredicate = NSPredicate(format: "color == %@", "green")
let colorBluePredicate = NSPredicate(format: "color == %@", "red")
let colorBlackPredicate = NSPredicate(format: "color == %@", "black")
let colorWhitePredicate = NSPredicate(format: "color == %@", "white")

let colorPredicates: NSArray = [**add colors here when they're selected**]

我试图找出最干净的方法,但我发现的例子只检索不同的项目。

我遇到的另一个障碍是如何将SelectionVC的结果传到ResultsTVC。我知道我需要代表,但我需要什么?对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您希望最终得到一个谓词:

type == %@ AND color IN %@

然后将您的类型作为字符串提供,将颜色作为集合提供。您可以使用从其他2个创建的复合谓词执行此操作,或者只更改UI选择的含义并生成两个参数作为段名称和颜色数组。

如果你想组合双簧管的多个选项,那么你需要创建每个选项,然后使用复合谓词来组合它们。

答案 1 :(得分:1)

你的问题不明确。您的谓词语法错误 - 难以理解。话虽这么说,我想我猜你想要什么,所以在这里。

您可以从没有任何过滤器的完全加载的表视图开始。您可以实现一个过滤器菜单(或按钮),并以模态方式显示相应的控件(分段控件,具有多个选择的表视图,具有单个选择的表视图,滑块等)。

在原始表格视图中,您使用NSFetchedResultsController,并保留NSPredicate作为属性。每当谓词发生变化时,您nil取出获取的结果控制器并重新加载表。

模态控件视图可以反馈给主视图控制器,然后主视图控制器修改谓词。您可以将所有谓词与NSCompoundPredicate API结合使用。也许将它们保存在一个可变数组中是最方便的,所以你可以方便地使用它们。

var predicateArray = [NSPredicate]()

E.g。从这个开始

predicate = NSPredicate(value: "true")
predicateArray.append(predicate)

现在颜色控制器发送回["red", "green", "blue"]。您可以通过构造正确的谓词字符串或使用orPredicateWithSubpredicates来构造或谓词,但是使用集合运算符可能更容易:

let colorPredicate = NSPredicate(format: "color in %@", colorStrings)!
predicateArray.append(colorPredicate)

在获取的结果控制器getter中,您可以根据谓词数组重构谓词:

fetchRequest.predicate = 
   NSCompoundPredicate.andPredicateWithSubpredicates(predicateArray)