搜索数组 swift 中的对象
Searching through objects in array swift
我正在尝试使用 UISearchController 创建搜索功能。但是我似乎无法让它与我的团队对象一起工作。我首先创建了一个包含 ID、名称和短名称的团队对象。然后我从 url 中检索 teamData 并将团队对象添加到填充到 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
}
}
你能post你的团队对象的定义,以及它包含的任何子对象吗? (团队数据).
同时指明您希望搜索文本出现在团队对象中的什么位置。
我没有经常使用 NSPRedicate,但我对 CONTAINS 比较的理解是它检查单个字段以查看它是否包含子字符串。我认为它不会检查您正在搜索的对象的所有字段。这似乎是你所期待的。
teamArray 中的对象没有 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)
let searchPredicate = NSPredicate(format: "name contains[c] %@", searchWord)
self.filteredArray = self.array.filteredArrayUsingPredicate(searchPredicate)
我正在尝试使用 UISearchController 创建搜索功能。但是我似乎无法让它与我的团队对象一起工作。我首先创建了一个包含 ID、名称和短名称的团队对象。然后我从 url 中检索 teamData 并将团队对象添加到填充到 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
}
}
你能post你的团队对象的定义,以及它包含的任何子对象吗? (团队数据).
同时指明您希望搜索文本出现在团队对象中的什么位置。
我没有经常使用 NSPRedicate,但我对 CONTAINS 比较的理解是它检查单个字段以查看它是否包含子字符串。我认为它不会检查您正在搜索的对象的所有字段。这似乎是你所期待的。
teamArray 中的对象没有 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)
let searchPredicate = NSPredicate(format: "name contains[c] %@", searchWord)
self.filteredArray = self.array.filteredArrayUsingPredicate(searchPredicate)