从 UITableView 中的数组中的类中搜索属性
Posted
技术标签:
【中文标题】从 UITableView 中的数组中的类中搜索属性【英文标题】:Search property from class in array within UITableView 【发布时间】:2015-09-26 12:48:34 【问题描述】:上下文:Swift、ios8-9、UITableView、UISearchController。 基于此示例的代码:http://www.ioscreator.com/tutorials/add-search-table-view-tutorial-ios8-swift
func updateSearchResultsForSearchController(searchController: UISearchController)
filteredTableData.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let scores = (allScores as NSArray).filteredArrayUsingPredicate(searchPredicate)
filteredTableData = scores as! [Score]
tableView.reloadData()
问题:我的数据来自一个类 Score
,它有一个属性 name
,这就是我需要查看的内容(理想情况下是 name
和 topic
,但使用 name
我会很高兴目前)。所以allScores as NSArray
不起作用,因为Score
不包含文本,但name
属性包含。我怎样才能在这里实现呢? allScores.name
之类的东西显然不起作用,但我不知道如何调用数组中所有项目的 name 属性。
【问题讨论】:
为什么选择 NSArray 和 NSPredicate?直接在 Swift 数组上使用 Swift 过滤器方法。参见例如***.com/questions/32767274/…。 【参考方案1】:如果您想使用NSPredicate
,请从NSObject
派生您的Score
类,并且只需在谓词中使用属性名称(不需要SELF
)。
class Score: NSObject
var name: String
init(name: String)
self.name = name
override var description: String
return self.name
let allScores = [Score(name: "a"), Score(name: "ab"), Score(name: "b")]
let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@", "b")
let scores = (allScores as NSArray).filteredArrayUsingPredicate(searchPredicate)
print(scores)
上面的 sn -p 在控制台上打印[ab, b]
。
但是,您可以使用 Swift 的 filter
方法获得完全相同的结果。
let allScores = [Score(name: "a"), Score(name: "ab"), Score(name: "b")]
let scores = allScores.filter $0.name.containsString("b")
print(scores)
这个 sn-p 再次在控制台上打印 [ab, b]
,证明它与 NSPredicate
变体相等。
【讨论】:
这行得通,虽然我需要let filteredScores = allScores.filter$0.name.localizedCaseInsensitiveContainsString("b")
使它正常工作:-)以上是关于从 UITableView 中的数组中的类中搜索属性的主要内容,如果未能解决你的问题,请参考以下文章