搜索完单元格后,我想点击它并执行操作。但是在搜索之后,我的单元格的索引总是0,因为它是表视图中的第一个东西。
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
@IBOutlet weak var TableView: UITableView!
@IBOutlet weak var SearchBar: UISearchBar!
var Array = ["One","Two","Three","Four"]
var myIndex = Int()
var Filter = [String]()
var isSearching = false
override func viewDidLoad() {
super.viewDidLoad()
TableView.delegate = self
TableView.dataSource = self
SearchBar.delegate = self
SearchBar.returnKeyType = UIReturnKeyType.done
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if isSearching {
return Filter.count
}
return Array.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 55
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = TableView.dequeueReusableCell(withIdentifier: "cell") as! CustomTableViewCell
cell.CellLabel.text = Array[indexPath.row]
if isSearching {
cell.CellLabel.text = Filter[indexPath.row]
}else {
cell.CellLabel.text = Array[indexPath.row]
}
return cell
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if SearchBar.text == nil || searchBar.text == "" {
isSearching = false
view.endEditing(true)
TableView.reloadData()
}else {
isSearching = true
Filter = Array.filter({$0.contains(searchBar.text!)})
TableView.reloadData()
}}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
myIndex = indexPath.row
switch myIndex {
case 0:
print("one")
case 1:
print("two")
case 2:
print("three")
case 3:
print("four")
default:
print("Error")
}
}
}
答案 0 :(得分:2)
您需要将搜索isSearching
逻辑放在didSelectRowAt
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var index = 0
if isSearching {
index = Array.index(of:Filter[indexPath.row])
}
else {
index = Array.index(of:Array[indexPath.row])
}
}
答案 1 :(得分:0)
在tableView(:didSelectRowAt)方法中,您有从0
到3
的硬编码索引。但是,tableView在Array
和Filter
个集合之间切换。此外,Filter
集合中的数据可能会发生变化,具体取决于搜索字段中的文字。
你可以像@Sh_Khan一样解决它。但也许更好的做法是拥有一个与tableView绑定的过滤集合和一个包含所有数据的未经更改的集合。
这样,您无需检查是否在每种方法中都设置了isSearching
。事实上,你完全不需要它。您只需要执行以下操作:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Filter.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomTableViewCell
cell.CellLabel.text = Filter[indexPath.row]
return cell
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == nil || searchBar.text == "" {
view.endEditing(true)
Filter = Array.compactMap({ $0 }) // Copies all elements from Array
} else {
Filter = Array.filter({ $0.contains(searchBar.text!) })
}
TableView.reloadData()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(Filter[indexPath.row])
}