2015-09-26 57 views
1

上下文:Swift,iOS8-9,UITableView,UISearchController。基于这个例子 代码:http://www.ioscreator.com/tutorials/add-search-table-view-tutorial-ios8-swift从UITableView中的类中搜索属性

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显然不起作用,但我不知道如何调用数组中所有项目的名称属性。

+2

为什么NSArray和NSPredicate?直接在Swift数组上使用Swift过滤器方法。请参阅http://stackoverflow.com/questions/32767274/filter-by-array-of-objects-searchcontroller。 –

回答

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) 

上面的代码片段在控制台上打印[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) 

这个片段再次这表明其对NSPredicate变种平等控制台上打印[ab, b]

+0

虽然我需要'let filteredScores = allScores.filter {$ 0.name.localizedCaseInsensitiveContainsString(“b”)}“,但它能够正常工作:-) – Pieter