2015-09-26 53 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