2017-04-05 9 views
1

私はプログラムでテーブルビューに検索バーを設定し、検索バーにスコープバーを追加しました。私は、ユーザーがスコープボタンの1つをタップするときに正しい情報を表示する方法を理解しようとしています。たとえば、「Sweet」スコープボタンをタップすると、データモデルのsweetに関連付けられているすべての果物のみが表示されます。これまでのコードです:Swift 3:プログラム的に機能するスコープバー

答えて

2

まず、filterContentsforSearchTextメソッドを更新してください。 searchTextが空の場合は、すぐにcategoryMatchを返す必要があります:

func filterContentsforSearchText(searchText: String, scope: String = "All"){ 
    filteredFruits = fruits.filter { fruit in 
     let categoryMatch = (scope == "All") || (fruit.category == scope) 
     if searchText.isEmpty { 
      return categoryMatch 
     } 
     return categoryMatch && fruit.name.lowercased().contains(searchText.lowercased()) 
    } 

    myTable.reloadData() 
} 

はその後、すべての searchController.searchBar.text != ""文を削除、あなたが任意のより多くのそれらを必要としません。

最終的なコード:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchResultsUpdating { 

    @IBOutlet weak var myTable: UITableView! 

    var fruits = [Fruits]() 
    var filteredFruits = [Fruits]() 
    var selectIndex: IndexPath = IndexPath() 
    var fruitName: String! 
    var myArray = ["All", "Sweet", "Fresh", "Other"] 
    var sweets = [String]() 

    var searchController = UISearchController(searchResultsController: nil) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     fruits = [ 
      Fruits(category: "Fresh", name: "Apple"), 
      Fruits(category: "Fresh", name: "Strawberry"), 
      Fruits(category: "Sweet", name: "Mango"), 
      Fruits(category: "Sweet", name: "Cherry"), 
      Fruits(category: "Sweet", name: "Grapes"), 
      Fruits(category: "Other", name: "Orange"), 
      Fruits(category: "Sweet", name: "Banana"), 
      Fruits(category: "Fresh", name: "Tomatoe"), 
     ] 

     myTable.delegate = self 
     myTable.dataSource = self 

     searchController.dimsBackgroundDuringPresentation = false 
     self.definesPresentationContext = true 
     searchController.searchResultsUpdater = self 
     searchController.searchBar.scopeButtonTitles = ["All", "Sweet", "Fresh", "Other"] 
     searchController.searchBar.delegate = self 
     myTable.tableHeaderView = searchController.searchBar 
     searchController.searchBar.barTintColor = UIColor.white 
    } 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 

    } 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     if searchController.isActive { 
      return filteredFruits.count 
     } 

     return fruits.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     fruitName = fruits[indexPath.row].name 
     let cell = myTable.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
     let fruit: Fruits 
     if searchController.isActive { 
      fruit = filteredFruits[indexPath.row] 
     } else { 
      fruit = fruits[indexPath.row] 
     } 

     if fruits[indexPath.row].category == "Sweet"{ 
      sweets = [fruits[indexPath.row].category] 
      print(sweets) 

     } 

     cell.textLabel?.text = fruit.name 
     cell.detailTextLabel?.text = fruit.category 


     return cell 
    } 

    //SearchBar 
    func updateSearchResults(for searchController: UISearchController) { 
     let searchBar = searchController.searchBar 
     let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] 
     filterContentsforSearchText(searchText: searchController.searchBar.text!, scope: scope) 

    } 

    func filterContentsforSearchText(searchText: String, scope: String = "All"){ 
     filteredFruits = fruits.filter { fruit in 
      let categoryMatch = (scope == "All") || (fruit.category == scope) 
      if searchText.isEmpty { 
       return categoryMatch 
      } 
      return categoryMatch && fruit.name.lowercased().contains(searchText.lowercased()) 
     } 

     myTable.reloadData() 
    } 

    func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { 
     filterContentsforSearchText(searchText: searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope]) 

     print("selectedScope: \(selectedScope)") 
     if selectedScope == 1{ 
      print("Sweet") 
     } 

    } 
} 

そして、あなたが期待どおりに働いています!

enter image description here

+0

あなたの方法は機能しますが、私は小さな問題がありました。たとえば、 の場合、テーブルビューには8つの項目があります。最後の4つのアイテムをフィルタリングするためにスコープを使用すると、最後の4つのアイテムが正しく表示されますが、セルをクリックすると、最初の4つのアイテムの情報が表示されます。ビューコントローラがセグメンテーションするときに正しい情報を表示する方法がありますか? – Geniouse

+0

'tableView(_:didSelectRowAt:)'メソッドを使用して、 'tableView(_:cellForRowAt:)'メソッドと同じように選択した果物を取得する必要があります。今、あなたは確かに果物の情報を持っています。あなたはセグを実行するか、その果実を渡すことによって何かをすることができます。 –

関連する問題