在我的代码中,当implementation
我func
:filterContentForSearchText(searchText:String, scope:String)
错误来了:
let resultPredicate:NSPredicate = NSPredicate.init(format: "name contains[c] \(searchText)", searchText)
resultDataSource = dataSource?.filtered(using: resultPredicate) as NSArray? // the red error:Value of type '[String]' has no member 'filtered'
我在下面发布我的代码:
import UIKit
class StoreListViewController: UIViewController, UISearchBarDelegate,UISearchDisplayDelegate,UITableViewDelegate,UITableViewDataSource {
var dataSource:[String]? = nil
var resultDataSource:NSArray? = nil
override func viewDidLoad() {
super.viewDidLoad()
initData()
initUI()
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
// MARK: - init
func initData(){
self.searchDisplayController?.searchResultsDelegate = self
self.searchDisplayController?.searchResultsDataSource = self
self.searchDisplayController?.delegate = self
dataSource = ["a","a","a","a" ]
}
func initUI() -> Void {
}
// MARK: - tableView delegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.searchDisplayController?.searchResultsTableView {
return (dataSource?.count)!
}else {
return (resultDataSource?.count)!
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 50
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell_id = "StoreListTabCell"
var cell:StoreListTabCell = tableView.dequeueReusableCell(withIdentifier: cell_id) as! StoreListTabCell
cell.title_label.text = dataSource?[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
// MARK: - filter delegate
func filterContentForSearchText(searchText:String, scope:String) -> Void {
// NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
// filteredist = [OldList filteredArrayUsingPredicate:resultPredicate];
let resultPredicate:NSPredicate = NSPredicate.init(format: "name contains[c] \(searchText)", searchText)
resultDataSource = dataSource?.filtered(using: resultPredicate) as NSArray? // there is the error!!!
}
func searchDisplayController(_ controller: UISearchDisplayController, shouldReloadTableForSearch searchString: String?) -> Bool {
//let scope_str = searchDisplayController?.searchBar.scopeButtonTitles.objectAtIndex(self.searchDisplayController.searchBar.selectedScopeButtonIndex)
//[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
var scopeTitles:Array = (searchDisplayController?.searchBar.scopeButtonTitles)!
let selected_index = searchDisplayController?.searchBar.selectedScopeButtonIndex
let scope_str = scopeTitles[selected_index!]
filterContentForSearchText(searchText: searchString!, scope:scope_str)
return true
}
}
在我的故事板中: