You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:37:10