Search code examples
iosuisearchbarviewcontrolleruisearchcontrollernavigationcontroller

SearchResultsController obscures screen when used with UINavigationItem


I'm using new integrated UISearchBar available in iOS 11, the problem is as soon as I tap on the searchbar and start typing text, the SearchResultsController obscures the whole screen, including the searchbar. It is impossible to dismiss the results controller or cancel search afterwards.

To demonstrate the issue, I've configured a minimal reproducible example:

import UIKit

let reuseid = "reuseIdentifier"
class TableViewController: UITableViewController, UISearchResultsUpdating {
  override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: reuseid)
  }

  // MARK: - Table view data source

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

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
  }

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseid, for: indexPath)
    return cell
  }

  func updateSearchResults(for searchController: UISearchController) {
    print(searchController.searchBar.text)
  }
}


class ViewController: UIViewController {
  var searchController: UISearchController!
  override func viewDidLoad() {
    super.viewDidLoad()
    searchController = UISearchController(searchResultsController: TableViewController())
    navigationItem.searchController = searchController
  }
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  var window: UIWindow?
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.backgroundColor = UIColor.white
    window?.makeKeyAndVisible()
    let nc = UINavigationController(rootViewController: ViewController())
    window?.rootViewController = nc
    return true
  }
}
  1. Initial state 1
  2. Tapping on the SearchBar 2
  3. The screen is obscured by the UITableView - colored in green 3

What could cause this bug and how can it be avoided?


Solution

  • Solved by adding this to the SearchResultsUpdater:

    edgesForExtendedLayout = []
    

    With default edges, the ResultsController tries to extend its view beyond the UINavigationBar and hence, obscures it:

    enter image description here