我试图做到以下几点:当用户打开这个狗品种的应用程序时,出现一个带有搜索栏的空表。当用户点击搜索栏并输入字母A时,他们将看到与字母A/a匹配的品种。当用户点击一只狗品种时,该品种将被添加到他们之前看到的空表中。下面是我的代码我需要两个TableViewControllers吗?
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()
}
我在那里我可以点击一个品种的狗,柯基例如点,它被添加到TableView中,但是当我点击柯基我得到一个错误。我假设这是因为我为我的搜索和Tableview填充使用了1个TableView,并且调用TableView didSelectRowAt适用于整个表格,而不仅仅是过滤的搜索。另外,如何在单击行后转换回tableview?
你会说这是它是如何正常完成? – LampPost
@LampPost这取决于情况很好,但是当你在多个地方看到相同的'if' /'else'模式时,认为控制器应该分开是一个很好的理由。 – dasblinkenlight