如何定制UISearchBar搜索后生成的结果TableView样式?
我刚好处理过类似的需求,其实系统生成的这个搜索结果TableView完全是可以定制的,核心是找到正确的访问方式,下面分两种常用场景给你具体方案:
方案一:使用系统默认的UISearchController(iOS 11+推荐)
当你初始化UISearchController时如果传入nil作为searchResultsController,系统会自动创建一个默认的UITableViewController来展示搜索结果。你可以直接通过searchController.searchResultsController拿到这个控制器,再获取它的tableView来设置样式:
// 在视图控制器的viewDidLoad或初始化方法中 override func viewDidLoad() { super.viewDidLoad() // 初始化搜索控制器 let searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = self searchController.obscuresBackgroundDuringPresentation = false navigationItem.searchController = searchController // 获取系统默认的搜索结果TableView并定制样式 if let resultsTableView = searchController.searchResultsController?.view as? UITableView { // 和原TableView保持一致的背景色 resultsTableView.backgroundColor = originalTableView.backgroundColor // 设置分隔符内边距 resultsTableView.separatorInset = originalTableView.separatorInset // 分隔符样式同步 resultsTableView.separatorStyle = originalTableView.separatorStyle // 如果需要自定义cell,别忘了在这里注册相同的cell类 resultsTableView.register(YourCustomCell.self, forCellReuseIdentifier: "CustomCellID") } }
方案二:自定义搜索结果控制器
如果需要更灵活的定制,你可以自己创建一个UITableViewController子类作为搜索结果控制器,直接在这个子类里配置tableView的所有样式,和你的原TableView保持一致:
// 自定义搜索结果控制器 class SearchResultsVC: UITableViewController { override func viewDidLoad() { super.viewDidLoad() // 这里直接把样式配置成和原TableView一样 tableView.backgroundColor = UIColor.systemGray6 tableView.separatorInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16) tableView.separatorColor = UIColor.systemGray4 // 注册自定义cell tableView.register(YourCustomCell.self, forCellReuseIdentifier: "CustomCellID") } } // 在主视图控制器中初始化搜索控制器 override func viewDidLoad() { super.viewDidLoad() let resultsVC = SearchResultsVC() let searchController = UISearchController(searchResultsController: resultsVC) searchController.searchResultsUpdater = self navigationItem.searchController = searchController // 如果需要传递数据给自定义控制器,可以在这里设置代理或者直接赋值 resultsVC.searchData = yourDataSource }
旧API兼容(UISearchDisplayController)
如果你的项目还在使用较旧的UISearchDisplayController,可以直接通过searchDisplayController?.searchResultsTableView访问到搜索结果TableView,然后设置样式:
override func viewDidLoad() { super.viewDidLoad() // 配置搜索结果TableView样式 searchDisplayController?.searchResultsTableView.backgroundColor = originalTableView.backgroundColor searchDisplayController?.searchResultsTableView.separatorInset = originalTableView.separatorInset }
另外要注意,不管用哪种方式,在实现UISearchResultsUpdating的updateSearchResults(for:)方法时,记得给搜索结果TableView的数据源赋值,确保cell的样式和原TableView一致(比如复用相同的cell类和配置逻辑)。
内容的提问来源于stack exchange,提问作者makle
相关产品推荐
相关产品推荐

