2017-06-17 158 views
1

我试图做到以下几点:当用户打开这个狗品种的应用程序时,出现一个带有搜索栏的空表。当用户点击搜索栏并输入字母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?

回答

0

既然你已经在多个地方

if tableView == self.tableView { 
    // Use behavior for the first view controller 
} else { 
    // Use behavior for the second view controller 
} 

此调度模式,你很可能是两个独立的视图控制器,每个都具有属于其所控制表视图代码更好。这会提高代码的可读性,即使总长度会略微增加,因为相关的代码块将彼此更接近。

+0

你会说这是它是如何正常完成? – LampPost

+0

@LampPost这取决于情况很好,但是当你在多个地方看到相同的'if' /'else'模式时,认为控制器应该分开是一个很好的理由。 – dasblinkenlight

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() 
}