我正在尝试执行以下操作:当用户打开此狗品种应用程序时,会出现一个带有搜索栏的空表。当用户点击搜索栏并输入字母A时,他们将看到与字母A / a匹配的品种。当用户点击狗品种时,该品种将被添加到他们之前看到的空表中。以下是我的代码
class TableViewController: UITableViewController, UISearchResultsUpdating {
var dogBreeds = ["Corgi", "Beagle", "Maltese", "Poodle", "Dachshund"]
var filteredDogs = [String]()
var selectedDogs = [String]()
var searchController: UISearchController!
var resultsController = UITableViewController()
override func viewDidLoad() {
super.viewDidLoad()
self.resultsController.tableView.dataSource = self
self.resultsController.tableView.delegate = self
self.searchController = UISearchController(searchResultsController: self.resultsController)
self.tableView.tableHeaderView = self.searchController.searchBar
self.searchController.searchResultsUpdater = self
self.searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
func updateSearchResults(for searchController: UISearchController) {
//filter through the Dogs array
self.filteredDogs = self.dogBreeds.filter { (breedName:String) -> Bool in
if breedName.lowercased().contains(self.searchController.searchBar.text!.lowercased()) {
return true
}
else {
return false
}
}
// update the table view
self.resultsController.tableView.reloadData()
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.tableView{
return self.selectedDogs.count
}
else {
return self.filteredDogs.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
if tableView == self.tableView {
if !selectedDogs.isEmpty {
cell.textLabel?.text = self.selectedDogs[indexPath.row]
}
}
else {
cell.textLabel?.text = self.filteredDogs[indexPath.row]
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedDogs.append(self.filteredDogs[indexPath.row])
self.tableView.reloadData()
}
我正处于能够点击狗品种Corgi的地步,然后它被添加到TableView中,但是当我点击Corgi时出现错误。我假设这是因为我使用1 TableView进行搜索和Tableview填充并调用TableView didSelectRowAt应用于整个表而不仅仅是过滤搜索。另外,如何在单击一行后转换回tableview?
答案 0 :(得分:0)
由于您在多个地方都有此调度模式
if tableView == self.tableView {
// Use behavior for the first view controller
} else {
// Use behavior for the second view controller
}
使用两个独立的视图控制器可能会更好,每个视图控制器都有属于由它控制的表视图的代码。这将提高代码的可读性,即使总长度会稍微增加,因为相关的代码块会彼此更接近。
答案 1 :(得分:0)
有两个表视图控制器意味着您需要另外一组长的委托和数据源以及传递搜索结果等数据。在您的情况下,使用单个表格视图完成作业非常容易。您只需要对分离选定的数组和已过滤的数组进行一些简单的调整。
替换
if tableView == self.tableView {
} else {
}
使用
if searchController.searchBar.text != "" {
} else {
}
在这种情况下,我们说,如果您的搜索栏中有一些文字,则显示过滤结果,否则显示所选结果。然后在您的单元格中单击侦听器:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedDogs.append(self.filteredDogs[indexPath.row])
searchController.searchBar.text = ""
//This is also a good practice to remove text in search bar and then send user back to selected list.
self.tableView.reloadData()
}