如何从 SearchBar 获取 Tableview 中所有项目的当前项目的索引
How to get the index of current item of all items in Tableview from SearchBar
我正在尝试从 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: {[=10=].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)
}
}
编辑: 因为你的模型没有任何独特的 属性 class 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[[=12=]].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[[=12=]].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[[=12=]].reviewSum.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
}
现在 commit editingStyle
获取此索引形式数组并从主数组和过滤器数组中删除该对象。
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)
}
}
我正在尝试从 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: {[=10=].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)
}
}
编辑: 因为你的模型没有任何独特的 属性 class 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[[=12=]].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[[=12=]].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[[=12=]].reviewSum.lowercased().contains(text.lowercased())
})
self.tableView.reloadData()
}
现在 commit editingStyle
获取此索引形式数组并从主数组和过滤器数组中删除该对象。
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)
}
}