2017-04-05 41 views
1

我已經設置了一個搜索欄到我的表格視圖編程,並添加一個範圍欄到搜索欄。我試圖弄清楚當用戶點擊一個範圍按鈕時如何顯示正確的信息。例如,如果他們點擊「甜」範圍按鈕,它只會顯示與數據模型中的甜點相關的所有水果。這是我到目前爲止的代碼:Swift 3:以編程方式運行的範圍欄

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 && searchController.searchBar.text != "" { 
     return filteredFruits.count 
    } 

    return fruits.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    fruitName = fruits[indexPath.row].name 
    let cell = myTable.dequeueReusableCell(withIdentifier: cellID, for: indexPath) 
    let fruit: Fruits 
    if searchController.isActive && searchController.searchBar.text != ""{ 
     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) 
     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]) 

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

} 



} 

回答

2

首先,讓我們更新filterContentsforSearchText方法。你應該立即返回categoryMatch如果searchText爲空:

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個項目。如果我使用範圍來過濾最後四個項目,它會正確顯示最後四個項目,但是當我單擊單元格時,它會顯示前四個項目的信息。當視圖控制器出現故障時,是否有另外一種方式讓我顯示正確的信息? – Geniouse

+0

您應該使用'tableView(_:didSelectRowAt:)'方法,並像方法'tableView(_:cellForRowAt:)'一樣檢索選中的水果。現在,你有一個正確的水果信息。您可以通過傳遞水果來執行賽格或做某事。 –

相關問題