按对象数组过滤 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】:SequenceType
的filter()
方法不采用NSPredicate
作为一个参数,但是一个闭包,例如
let filteredTableData = sortedLocations.filter
$0.name.localizedCaseInsensitiveContainsString(searchText)
为每个数组元素调用闭包(这里使用简写
参数 $0
) 并返回 true
或 false
以指示元素是否
是否包含在过滤结果中。
您可以使用NSPredicate
过滤NSArray
,看起来
喜欢
let filtered = someNSArray.filteredArrayUsingPredicate(predicate)
但如果你有一个 Swift 数组,就没有理由使用它。
【讨论】:
hmm 但是filteredTableData
,当我写一些包含在对象名称中的东西时,它似乎没有包含任何东西?我需要附加任何东西吗?
@PeterPik:我刚刚用一个小测试程序仔细检查了它,它按预期工作。
但我不应该附加任何东西吗?
@PeterPik:对不起,我不明白。附加什么? sortedLocations
是包含所有组织的“完整”数组,filteredTableData
是过滤后的数组,其中包含名称包含给定搜索字符串的组织。以上是关于按对象数组过滤 searchController的主要内容,如果未能解决你的问题,请参考以下文章