SearchResultsController 与 UINavigationItem 一起使用时会遮挡屏幕

Posted

技术标签:

【中文标题】SearchResultsController 与 UINavigationItem 一起使用时会遮挡屏幕【英文标题】:SearchResultsController obscures screen when used with UINavigationItem 【发布时间】:2018-05-02 14:24:20 【问题描述】:

我正在使用 ios 11 中提供的新集成 UISearchBar,问题是当我点击搜索栏并开始输入文本时,SearchResultsController 会遮盖整个屏幕,包括搜索栏。之后无法关闭结果控制器或取消搜索。

为了演示这个问题,我配置了一个最小的可重现示例:

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
  

    初始状态 点击搜索栏 屏幕被UITableView 遮挡 - 以绿色着色

什么可能导致此错误以及如何避免?

【问题讨论】:

【参考方案1】:

通过将此添加到SearchResultsUpdater 解决:

edgesForExtendedLayout = []

使用默认边缘时,ResultsController 会尝试将其视图扩展到 UINavigationBar 之外,因此会使其模糊:

【讨论】:

以上是关于SearchResultsController 与 UINavigationItem 一起使用时会遮挡屏幕的主要内容,如果未能解决你的问题,请参考以下文章

SearchResultsController 出现在 UINavigationBar

如何从 searchResultsController (UISearchController) 更新数据

Swift - 带有单独 searchResultsController 的 UISearchController

UISearchController:searchResultsController 不显示

显示 searchResultsController 时出现 UISearchBar AutoLayout 错误

在 SearchBar Tap 上显示 UISearchController 的 SearchResultsController