我正在尝试从Tableview中删除一个项目,如果SearchBar为空,则一切正常,(indexPath是正确的索引)。但是如果我使用SearchBar,我会得到过滤项的索引。
如何从Tableview获取项目的当前索引?但在使用SearchBar过滤后。
func filterTableView(ind:Int,text:String) {
switch ind {
case selectedScope.reviewDate.rawValue:
filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in
return mod.reviewDate.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
case selectedScope.reviewPlace.rawValue:
filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in
return mod.reviewPlace.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
case selectedScope.reviewSum.rawValue:
filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in
return mod.reviewSum.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
}
}
static var reviewDaysArr:[ReviewDay] = [
ReviewDay(reviewDate: "03/03/2017", reviewPlace: "Manhattan"),
ReviewDay(reviewDate: "03/03/2017", reviewPlace: "Manhattan"),
ReviewDay(reviewDate: "05/03/2017", reviewPlace: "New Jersey")
]
var filteredDays = reviewDaysArr
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
ViewController.reviewDaysArr.remove(at: indexPath.row)
filteredDays = ViewController.reviewDaysArr
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
您可以从过滤后的数组中获取主数组的索引。
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
//First check using your condition that is search active
if searchActive {
//I'm comparing movieId you can compare any unique property of your Movie class
if let index = ViewController.dataArr.index(where: {$0.movieId == filterdData[indexPath.row].movieId}) {
//Remove object from mainArray
ViewController.dataArr.remove(at: index)
//Remove object from filtered array
filterdData.remove(at: indexPath.row)
}
}
else {
ViewController.dataArr.remove(at: indexPath.row)
}
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
编辑:由于您的模型类没有任何唯一属性,Movie
因此只有一种获取对象索引的方法。您需要获取与主数组相对应的已过滤数组的索引数组。因此,声明一个类型为数组的数组,[Int]
并在对数组进行过滤后获得该数组中的过滤器对象索引。
var filterIndices = [Int]()
现在,您在过滤数组的地方也初始化了该数组。
switch ind {
case selectedScope.reviewDate.rawValue:
filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in
return mod.reviewDate.lowercased().contains(text.lowercased())
})
filterIndices = ViewController.reviewDaysArr.indices.filter({
ViewController.reviewDaysArr[$0].reviewDate.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
case selectedScope.reviewPlace.rawValue:
filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in
return mod.reviewPlace.lowercased().contains(text.lowercased())
})
filterIndices = ViewController.reviewDaysArr.indices.filter({
ViewController.reviewDaysArr[$0].reviewPlace.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
case selectedScope.reviewSum.rawValue:
filteredDays = ViewController.reviewDaysArr.filter({ (mod) -> Bool in
return mod.reviewSum.lowercased().contains(text.lowercased())
})
filterIndices = ViewController.reviewDaysArr.indices.filter({
ViewController.reviewDaysArr[$0].reviewSum.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
}
现在,commit editingStyle
获取该索引表单数组,并从main和filter数组中删除该对象。
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
//First check using your condition that is search active
if searchActive {
//Remove object from mainArray using filterIndices
ViewController.reviewDaysArr.remove(at: filterIndices[indexPath.row])
//Remove object from filtered array
filteredDays.remove(at: indexPath.row)
}
else {
ViewController.reviewDaysArr.remove(at: indexPath.row)
}
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句