2017-06-17 83 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() 
}