快速search数组中的对象

我试图使用UISearchController创build一个searchfunction。 但是,我似乎不能使它与我的团队对象工作。 我已经开始创build一个包含一个ID,名称和短名称的团队对象。 然后,我从URL中检索teamData,并将Team Objects添加到填充到tableView中的数组中。 这个tableView包含一个searchController,它可以过滤数据,但没有任何反应。

arrays

var teamArray = Array<Team>() var filteredTableData = [String]() 

GetTeams函数

 func getTeams(url: String) { isApiCalling = true request(.GET, url, parameters: nil) .response { (request, response, data, error) in if error == nil { let data: AnyObject = data! let jsonArray = JSON(data: data as! NSData) for (key: String, subJson: JSON) in jsonArray { // Create an object and parse your JSON one by one to append it to your array var newTeamObject = Team(id: subJson["id"].intValue, name: subJson["name"].stringValue, shortname: subJson["shortname"].stringValue) self.teamArray.append(newTeamObject) } self.isApiCalling = false self.tableView.reloadData() self.refreshControl?.endRefreshing() } } } 

的cellForRowAtIndexPath

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("teamCell", forIndexPath: indexPath) as! TeamCell cell.textLabel?.font = UIFont(name: "HelveticaNeue-Light", size: 20) cell.textLabel?.text = self.teamArray[indexPath.row].name as String if (self.cellSelected.containsObject(indexPath)) { cell.accessoryView = cell.accessoryCheck } else { cell.accessoryView = cell.accessoryUncheck } return cell } 

筛选数据

 func updateSearchResultsForSearchController(searchController: UISearchController) { filteredTableData.removeAll(keepCapacity: false) let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text) let array = (teamArray as NSArray).filteredArrayUsingPredicate(searchPredicate) filteredTableData = array as! [String] self.tableView.reloadData() } 

团队对象

 class Team{ var id: Int! var name: NSString! var shortname: NSString! init(id: Int, name:NSString, shortname: NSString) { self.id = id self.name = name self.shortname = shortname } } 

teamArray中的对象不具有SELF属性。 您不能使用SELF一次search对象的所有属性。 您必须提供该属性的名称,如果要search多个属性,则必须将所有这些属性添加到谓词中。

我认为这足以让你在名称属性中search如下所示:

 let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@", searchController.searchBar.text) 

如果你需要更多的属性,你可以这样做:

 let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@ OR shortname CONTAINS[c] %@", searchController.searchBar.text, searchController.searchBar.text) 

你可以发布你的Team对象的定义,以及它包含的任何子对象吗? (TeamData)。

同时指出您希望search文本在您的团队对象中出现的位置。

我没有使用NSPRedicate很多,但我对CONTAINS比较的理解是,它检查一个单独的字段,看它是否包含一个子string。 我不认为它会检查你正在search的对象的所有领域。 这看起来像你所期待的。

 let searchPredicate = NSPredicate(format: "name contains[c] %@", searchWord) self.filteredArray = self.array.filteredArrayUsingPredicate(searchPredicate)