在Swift中搜索数组中的对象

7
我正在尝试使用UISearchController创建搜索功能。但是我似乎无法使其与我的Team对象配合工作。我首先创建了一个Team对象,其中包含id、名称和简称。然后我从url检索teamData并将Team对象添加到数组中,该数组填充到tableView中。这个tableView包含一个searchController,应该过滤数据,但没有任何反应。
数组
var teamArray = Array<Team>()
var filteredTableData = [String]()

获取团队函数

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

}

}

嘿,我有相同的问题。我已经按照你的方法做了,一开始我遇到了"array cannot be bridged"的错误,然后我添加了"let array: NSArray"。最后,我在"filteredTableData"处遇到了"EXC_BAD_INSTRUCTION"的错误。请帮助我。 - Dave Cruise
3个回答

7
团队数组中的对象没有SELF属性。你不能使用SELF一次性搜索对象的所有属性。您必须提供属性名称,如果要在多个属性中搜索,则必须将所有这些属性添加到谓词中。
我认为只需要搜索名称属性就足够了:
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)

我需要想办法将搜索栏与updateSearchResultsForSearchController函数连接起来吗? - Peter Pik
这是一个教程,可以帮助您正确设置SearchController,以便调用updateSearchResultsForSearchController:http://www.ioscreator.com/tutorials/add-search-table-view-tutorial-ios8-swift - pteofil
2
好的,我错过了searchUpdate。现在出现错误:警告:类'Striky.Team'的对象0x7ff3aafc0e00没有实现'methodSignatureForSelector:'方法--有麻烦了。 未识别的选择器-[Striky.Team valueForKey:]。 - Peter Pik
如果你想避免出现“不实现methodSignatureForSelector方法”的错误,你需要从NSObject继承你的类。 - emreoktem

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

2

请问您能否发布您的Team对象及其包含的任何子对象(TeamData)的定义?

同时指明您期望在团队对象中搜索文本出现的位置。

我并没有经常使用NSPredicate,但我对CONTAINS比较的理解是它会检查单个字段是否包含一个子字符串。我不认为它会检查您正在搜索的对象的所有字段。这似乎是您所期望的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接