按对象数组过滤 searchController

Posted

技术标签:

【中文标题】按对象数组过滤 searchController【英文标题】:Filter by array of Objects searchController 【发布时间】:2015-09-24 17:15:47 【问题描述】:

我创建了一个 searchController,因此我试图让它根据 UISearchController 中的文本过滤内容。我创建了一个自定义对象,如下所示。我尝试过使用 NSPredicate,但不断收到:

cannot convert value of type NSPredicate to expected type @noescape (organization) throws...

class Organization: Object 
    var id: Int = 0
    var name: String = ""
    var shortName: String = ""
    var image: NSData = NSData()
    var pinImage: NSData = NSData()
    let locations = List<Location>()


然后我的 ViewController 中有一个名为 sortedLocations 的数组,其中包含许多 Organization 对象。

到目前为止我已经尝试过:

func updateSearchResultsForSearchController(searchController: UISearchController)

    filteredTableData.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF.name CONTAINS[c] %@", searchController.searchBar.text!)

    let array = sortedLocations.filter(searchPredicate)
    filteredTableData = array as! [Organization]



    self.tableView.reloadData()

【问题讨论】:

【参考方案1】:

SequenceTypefilter() 方法不采用NSPredicate 作为一个参数,但是一个闭包,例如

let filteredTableData = sortedLocations.filter 
    $0.name.localizedCaseInsensitiveContainsString(searchText)

为每个数组元素调用闭包(这里使用简写 参数 $0) 并返回 truefalse 以指示元素是否 是否包含在过滤结果中。


您可以使用NSPredicate 过滤NSArray,看起来 喜欢

let filtered = someNSArray.filteredArrayUsingPredicate(predicate)

但如果你有一个 Swift 数组,就没有理由使用它。

【讨论】:

hmm 但是filteredTableData,当我写一些包含在对象名称中的东西时,它似乎没有包含任何东西?我需要附加任何东西吗? @PeterPik:我刚刚用一个小测试程序仔细检查了它,它按预期工作。 但我不应该附加任何东西吗? @PeterPik:对不起,我不明白。附加什么? sortedLocations 是包含所有组织的“完整”数组,filteredTableData 是过滤后的数组,其中包含名称包含给定搜索字符串的组织。

以上是关于按对象数组过滤 searchController的主要内容,如果未能解决你的问题,请参考以下文章

按数组过滤对象数组

对象数组按另一个数组值过滤

除非我在搜索栏中点击,否则 SearchController 不会显示未过滤的结果

Vue JS按多个数组对象项过滤

按索引过滤对象数组

如何使用 jq 按元素属性值过滤对象数组?