swift BUTCHER swift BUTCHER - 6 months ago 220
Swift Question

How to implement UISearchController in UITableView - SWIFT

i am a newbie to swift. And i am trying to set up a search funtionality to the UITableView which is in ViewController class. I googled a lot and found that UISearchDisplayController has been deprecated and replaced by UISearchController. When i tried to search for tutorials i didnot find for UITableView ..some of them were implementing in UITableViewController. So here are my few questions :

1) Can we implement UISearchController in UITableView Class residing in ViewController Class(i guess we can )

2) If we can please convert these line of codes written in objective C. Or if there are some really good tutorials..i beg you drop it here :)

@property (strong, nonatomic) UISearchController *searchController;


UITableViewController *searchResultsController = [[UITableViewController alloc] init];


// Init UISearchController with the search results controller
self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];

// Link the search controller
self.searchController.searchResultsUpdater = self;


UISearchController in a UIViewController

EDIT :
i am trying to assign the search results updater in as

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {

override func viewDidLoad() {

super.viewDidLoad()
self.view.backgroundColor = UIColor.blackColor()
self.addTableViewWithSection()
self.searchResultsController = UITableViewController()
var controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
}
}


*However on the line controller.searchResultsUpdater = self i get the eroor as Cannot assign a value of typ "ViewController" to a value of type "UISearchResultsUpdating?" .. So i really doubt if i can use UISearchController in UIViewController type class.

Answer

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 updateSearchResultsForSearchController method that comes from the UISearchResultsUpdating protocol:

func updateSearchResultsForSearchController(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.

Comments