如何在数组类型为JSON时实现自定义搜索栏

时间:2017-03-16 09:03:52

标签: ios uitableview swift3 uisearchbar uisearchcontroller

我正在使用swift 3中的一个项目,我有一个特定的UIViewController,我有一个UITableView,并且在其单元格上填充数据,数据是从服务器获取的,我将它分配给该类型的数组JSON。因此,我有一个UISearch栏放在同一个UIViewController中的不同位置(而不是UITableView的标题)。我的要求是实现搜索栏的功能,我可以在其中过滤和搜索我的UITableView的数据。我怎样才能做到这一点?我在代码的一半工作,虽然这不是功能,代码如下。

import UIKit
import SwiftyJSON
import SDWebImage


class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchResultsUpdating,UISearchBarDelegate {
    @IBOutlet weak var tableView: UITableView!
    var count : Int = 0
    var searchActive : Bool?
    var selectedCategoryList = [JSON?]()
    var filterSelectedCategoryList = [JSON?]()
    let searchController = UISearchController(searchResultsController: nil)
    override func viewDidLoad() {
        super.viewDidLoad()
        passJson()

        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        searchController.searchBar.sizeToFit()
        self.tableView.tableHeaderView = searchController.searchBar
        searchController.searchBar.delegate = self
        self.tableView.reloadData()

        // Do any additional setup after loading the view, typically from a nib.
    }




    func updateSearchResults(for searchController: UISearchController) {




    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        filterSelectedCategoryList = selectedCategoryList.filter { titles in
            return (titles?["title"].stringValue.lowercased().contains(searchText.lowercased()))!
        }
        tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func passJson() {
        let path : String = Bundle.main.path(forResource: "JsonFile", ofType: "json") as String!

        let jsonData = NSData(contentsOfFile: path) as NSData!

        let readableJson = JSON(data: jsonData as! Data, options: JSONSerialization.ReadingOptions.mutableContainers, error: nil)

        let json = readableJson

         print(json)

        let selectedItemArray = json["itemList"].arrayValue
        self.selectedCategoryList = selectedItemArray
        print("new prints",self.selectedCategoryList)
        // print( "Count",selectedItemArray?.count as Any)


        self.count = self.selectedCategoryList.count
        print(self.count)


    }


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


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if self.searchController.isActive && searchController.searchBar.text != ""{
            return filterSelectedCategoryList.count
        }else{
            return selectedCategoryList.count
        }

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell
        if count > 0 {
            if self.searchController.isActive && searchController.searchBar.text != ""{

                cell.label.text = filterSelectedCategoryList[indexPath.row]?["healerName"].stringValue

            }else{
                cell.label.text = selectedCategoryList[indexPath.row]?["healerName"].stringValue
            }


        }
        return cell
    }



}

1 个答案:

答案 0 :(得分:1)

尝试实施UISearch​Bar​Delegate方法,但在此之前将searchBar.delegate设置为self中的viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    passJson()

    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true
    searchController.searchBar.sizeToFit()

    //Set the delegate of searchBar
    searchController.searchBar.delegate = self

    self.tableView.reloadData()
}

现在实施search​Bar(_:​text​Did​Change:​)的{​​{1}}方法并在该方法中过滤您的数组。

UISearchBarDelegate