从 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,这就是我需要查看的内容(理想情况下是 nametopic,但使用 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 中的数组中的类中搜索属性的主要内容,如果未能解决你的问题,请参考以下文章

如何获取存储在数组中的类中的值?

如何为objective-C中的类中的数组分配内存?

选择来自数组的类中的所有输入

从脚本中的类中获取值

如何从 Flash 中的类中命名 Movieclip 中的 Movieclip?

从 .NET Core 2 中的类中读取 appsettings.json