【问题标题】:Filter by array of Objects searchController按对象数组过滤 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()
}

【问题讨论】:

    标签: ios swift uisearchcontroller


    【解决方案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 是过滤后的数组,其中包含名称包含给定搜索字符串的组织。
    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多