2017-04-05 2 views
1

프로그래밍 방식으로 내 테이블보기에 검색 막대를 설정하고 검색 막대에 범위 막대를 추가했습니다. 사용자가 범위 단추 중 하나를 두 드릴 때 올바른 정보를 표시하는 방법을 알아 내려고합니다. 예를 들어, "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 :)'메소드와 같은 방식으로 선택된 과일을 가져와야합니다. 자, 당신은 정확한 열매의 정보를 가지고 있습니다. 당신은 segue를 수행하거나 그 과일을지나 무언가를 할 수 있습니다. –