NSCompoundPredicate没有按我的意愿工作

时间:2017-11-16 17:45:26

标签: ios swift nspredicate nsfetchedresultscontroller

我正在建立一个费用管理器,我有一个带有过滤器的搜索功能。对于所选的每个过滤器,我将相应的谓词附加到 fetchedResultsController 的谓词数组中。在我的过滤器中,我有“预算”和“费用”选项。以下代码显示了我如何附加谓词。

    if filterCell[0][0] {
        predicatesArray.append(NSPredicate(format: "type == %@", "budget" as NSString))
    }
    if filterCell[0][1] {
        predicatesArray.append(NSPredicate(format: "type == %@", "expense" as NSString))
    }

回到主表视图,我得到了这行代码:

fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicatesArray)

当只选择一个预算或费用时,当它们被选中时,tableview为空(显然,类型不能同时为“预算< / strong>“和”费用“)所以我切换到orPredicateWithSubpredicates。现在,如果我在我的过滤器中选择“预算”并按OK,我仍然会获得费用条目,反之亦然,因为此viewcontroller包含一个默认谓词(用户在选择一段时间后会进入此视图日期,例如13.11 - 16.11)并使用orPredicateWithSubpredicates没有任何作用,因为我的日期谓词将永远为真,唯一的选择是andPredicateWithSubpredicates

我应该在代码中修改哪些内容才能正常运行?

1 个答案:

答案 0 :(得分:1)

我解决了。问题在于设置谓词不应用它们。正确的方法是andPredicateWithSubpredicates,我应用谓词的方式是使用以下代码:

    if filterCell[0][0] && filterCell[0][1] {
        predicatesArray.append(NSPredicate(format: "(type == %@) OR (type == %@)", "budget" as NSString, "expense" as NSString))
    } else if filterCell[0][0] {
        predicatesArray.append(NSPredicate(format: "type == %@", "budget" as NSString))
    } else if filterCell[0][1] {
        predicatesArray.append(NSPredicate(format: "type == %@", "expense" as NSString))
    }