【问题标题】:Searching through objects in array swift快速搜索数组中的对象
【发布时间】:2015-04-29 10:21:38
【问题描述】:

我正在尝试使用 UISearchController 创建搜索功能。但是我似乎无法让它与我的团队对象一起使用。我首先创建了一个包含 id、名称和短名称的团队对象。然后我从 url 中检索 teamData 并将 Team Objects 添加到填充到 tableView 中的数组中。这个 tableView 包含一个 searchController,它应该过滤数据,但没有任何反应。

数组

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

}

}

【问题讨论】:

  • 嘿,我也有同样的问题。我按照你的方式,起初,我得到数组无法桥接,然后我添加了让数组:NSArray。最后我在filteredTableData 得到EXC_BAD_INSTRUCTION。请帮帮我。

标签: ios uitableview swift uisearchcontroller


【解决方案1】:

teamArray 中的对象没有 SELF 属性。您不能使用 SELF 一次搜索对象的所有属性。您必须给出属性的名称,如果要搜索多个属性,则必须将所有这些属性添加到谓词中。

我认为您可以像这样在 name 属性中进行搜索:

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)

【讨论】:

  • 嗯,我需要以某种方式将 searchBar 与 updateSearchResultsForSearchController 函数连接起来
  • 这里有一个教程可以帮助您正确设置 SearchController,以便调用 updateSearchResultsForSearchController:ioscreator.com/tutorials/…
  • 好吧,我错过了 searchUpdate。现在错误:警告:类“Striky.Team”的对象 0x7ff3aafc0e00 未实现 methodSignatureForSelector:- 前面有问题无法识别的选择器 -[Striky.Team valueForKey:]
  • 如果你想避免错误“没有实现methodSignatureForSelector”你需要从NSObject继承你的类
【解决方案2】:

您可以发布您的团队对象的定义,以及它包含的任何子对象吗? (团队数据)。

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

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

【讨论】:

    【解决方案3】:
    let searchPredicate = NSPredicate(format: "name contains[c] %@", searchWord)
    self.filteredArray = self.array.filteredArrayUsingPredicate(searchPredicate)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多