Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Double tap necessary to select TableView item with Search Bar

I have a UITableView with a search bar as header. I use this function to update my data when the user does a search in the search bar.

func updateSearchResults(for searchController: UISearchController) {

    if let searchText = searchController.searchBar.text {
        if (searchText.characters.count > 0) {
            self.filteredResults  = [];
            self.locationManager?.geocodeAddressString(addressString: searchText, completionHandler: { (results, error) in
                if error == nil && results != nil {
                    self.filteredResults = results!;
                    self.tableView.reloadData();
                }
            });
        }
        else {
            self.filteredResults  = [];
            self.tableView.reloadData();
        }
    }
}

and this function when I select a cell in my UITableView.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    self.delegate?.setCity(city: str);
    self.dismiss(animated: true, completion: nil);
}

Here is my problem : the view controller doesn't dismiss at the first taps on the cell. I taps once, the search bar resign responder. And I need to tap twice for the dismiss to execute.

Here is how I link my tableview and my search bar in viewDidLoad:

// Search Bar componants
self.searchController = UISearchController(searchResultsController: nil);
self.searchController.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.hidesNavigationBarDuringPresentation = false
self.searchController.dimsBackgroundDuringPresentation = false;

self.searchBar = self.searchController.searchBar;
self.searchBar.searchBarStyle = .default;
self.searchBar.delegate = self;
self.searchBar.placeholder = NSLocalizedString("search.city", comment: "search.city").capitalized;

self.tableView = UITableView(frame: CGRect.zero, style: .plain);
self.tableView.translatesAutoresizingMaskIntoConstraints = false;
self.tableView.delegate = self;
self.tableView.backgroundColor = UIColor.white;
self.tableView.dataSource = self;
self.tableView.tableHeaderView = self.searchBar;
self.view.addSubview(self.tableView);

If someone could help me, that would be great :)

like image 972
Melanie Journe Avatar asked Oct 21 '16 13:10

Melanie Journe


1 Answers

Swift 4+ or iOS 10+

1- Remove searching overlay on viewDidLoad or elsewhere.

searchController.obscuresBackgroundDuringPresentation = false

2- In TableView didSelectRowAt delegate add this line.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     searchController.isActive = false
     <your code>
}

..Done..

Note: with iOS 11+ if you use the SearchController in the navigation item, you will not have this problem. If you present the ViewController with the searchController, just add a new navigation with your ViewController. And present the new navigation instead.

UINavigationController(rootViewController: ViewControllerWithSearchBar) 
like image 50
alegelos Avatar answered Oct 13 '22 19:10

alegelos