Swift 3:以编程方式运行的范围栏

时间:2017-04-05 02:23:48

标签: swift swift3 xcode8

我已经以编程方式为我的表视图设置了一个搜索栏,并在搜索栏中添加了一个范围栏。我试图找出当用户点击其中一个范围按钮时如何显示正确的信息。例如,如果他们点击“Sweet”范围按钮,它只显示数据模型中与sweet相关的所有水果。到目前为止,这是我的代码:

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

}



}

1 个答案:

答案 0 :(得分: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