How to implement UISearchController in UITableView - Swift

后端 未结 3 1131
予麋鹿
予麋鹿 2020-12-02 08:20

I am a newbie to Swift and I am trying to add search functionality to my UITableView which is in a UIViewController class. I googled a lot and foun

相关标签:
3条回答
  • 2020-12-02 08:51

    For those looking for a bit more context on all the aspects of implementing this, here's a tutorial on how to implement UISearchController

    In addition to the above answer by Andy Ibanez, you also need to add code to your UITableViewDataSource methods to show the newly filtered results in the tableview.

    Also, don't forget to call tableView.reloadData() in your updateSearchResults method - the UISearchController does not automatically tell the tableView to reload its data.

    0 讨论(0)
  • 2020-12-02 08:54

    In case of anyone, who is freaking around like me..this code might help

    class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate,UISearchResultsUpdating {
    
        @IBOutlet weak var tblView: UITableView!
    
        var tabledata = ["lucques","chickendijon","godaddy","amazon","chris","ambata","bankofamerica","abelcine","AUTO + TRANSPORTATION","BILLS + UTILITIES","FOOD + DINING","HEALTH","AutoCare", "Auto Payment" , "Gas+Fuel","Electric Bill", "Internet/Television","Fast Foodd", "Gorceries" , "Restaurants","Gym Membership", "Health Insurance","auto","note-bullet","knife","heart"]
    
        var filteredTableData = [String]()
        var resultSearchController = UISearchController()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            tblView.delegate = self
            tblView.dataSource = self
            self.resultSearchController = ({
                let controller = UISearchController(searchResultsController: nil)
                controller.searchResultsUpdater = self
                controller.dimsBackgroundDuringPresentation = false
                controller.searchBar.sizeToFit()
                controller.searchBar.barStyle = UIBarStyle.Black
                controller.searchBar.barTintColor = UIColor.whiteColor()
                controller.searchBar.backgroundColor = UIColor.clearColor()
                self.tblView.tableHeaderView = controller.searchBar
                return controller
            })()
            self.tblView.reloadData()
        }
    
         func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 1
        }
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if self.resultSearchController.active {
               return self.filteredTableData.count
            }else{
                return self.tabledata.count
           }
        }
         func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            var section = indexPath.section
            var row = indexPath.row
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier:"addCategoryCell")
            cell.selectionStyle =  UITableViewCellSelectionStyle.None
            cell.backgroundColor = UIColor.clearColor()
            cell.contentView.backgroundColor = UIColor.clearColor()
            cell.textLabel?.textAlignment = NSTextAlignment.Left
            cell.textLabel?.textColor = UIColor.blackColor()
            cell.textLabel?.font = UIFont.systemFontOfSize(14.0)
    
            if self.resultSearchController.active {
                  cell.textLabel?.text = filteredTableData[indexPath.row]
            } else {
                     cell.textLabel?.text = tabledata[indexPath.row]
            }
            return cell
        }
    
        func updateSearchResultsForSearchController(searchController: UISearchController) {
            filteredTableData.removeAll(keepCapacity: false)
            let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text)
            let array = (tabledata as NSArray).filteredArrayUsingPredicate(searchPredicate)
            filteredTableData = array as! [String]
            self.tblView.reloadData()
    
        }
    }
    
    0 讨论(0)
  • 2020-12-02 09:08

    Yes, the way search works has been radically changed for what I consider to be a better system. The new system is much better and straight to the point for most simple implementations. Using it is pretty straightforward.

    First, make your class comply with the UISearchResultsUpdating protocol.

    class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

    Add it the search controller property:

    class MyTableViewController: UTableViewController, UISearchResultsUpdating {
        let searchController = UISearchController(searchResultsController: nil)
    }
    

    Add the search bar in viewDidLoad:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.dimsBackgroundDuringPresentation = false
        searchController.searchBar.sizeToFit()
        self.tableView.tableHeaderView = searchController.searchBar
    }
    

    And finally, implement the updateSearchResults:for method that comes from the UISearchResultsUpdating protocol:

    func updateSearchResults(for searchController: UISearchController) {
    
    }
    

    Your implementation of this method will of course depend on where you are searching the data from. It will update your current table view with the contents of your search as you type them. Make sure you update your data source and reload the table view in the updateSearchResultsForSearchController method. Again, it updates as you type so make sure that if your data to search in is big or if you are searching from the internet, add some concurrency in this method.

    If you want to use a different controller to populate your search results with, you can pass that VC when initialising the searchController property.

    EDIT: I have reread your question and it looks like I forgot to add something important.

    UITableViewController has a member called tableView. You can grab the controller's table view , but to populate your UITableView, you don't need to touch it. You can't use the SearchController logic directly with UITableView. You gotta work with the controller to get it there. Use the UITableViewController delegate and data source methods to get your table UI updated with your search results.

    Please read on using UITableViewController, UITableViewDelegate, and UITableViewDataSource so you can understand how to get your search results there.

    0 讨论(0)
提交回复
热议问题