搜索控制器处于活动状态时出现表格视图时隐藏的第一行

Posted

技术标签:

【中文标题】搜索控制器处于活动状态时出现表格视图时隐藏的第一行【英文标题】:First row hidden when table view appears while search controller is active 【发布时间】:2017-06-10 22:20:55 【问题描述】:

我将 UISearchController 与 UITableViewController 一起使用。当我进行搜索时,我在表格中选择一行以转到详细视图,然后返回表格视图,表格的第一行隐藏在搜索栏后面。

我可以将第一行滚动回视图,但是当我放开滚动条时它只会弹回搜索栏后面。好郁闷!

在 viewDidLoad 我有:

searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
mainTable.tableHeaderView = searchController.searchBar

删除definePresentationContext = true 解决了这个问题,但我需要这样做以防止在用户转到其他视图控制器时搜索栏出现。

我花了几个小时寻找解决方案并尝试不同的方法来解决问题。

有什么方法可以设置表格的第一行,使其在表格视图重新出现时位于搜索栏下方?

我尝试在prepareForSegue中设置definePresentationContext = true,但没有奏效。

【问题讨论】:

使用 uiview 动画和布局约束将表格或集合视图向下推至顶部搜索控制器的高度。 【参考方案1】:

我找到了解决这个问题的方法。

    不要设置definePresentationContext = true

    在 prepare(for:sender:) 中,添加以下内容。这会保持搜索处于活动状态,但会阻止搜索栏和键盘出现在视图控制器上。

    searchController.searchBar.isHidden = true
    searchController.searchBar.endEditing(true)
    

    在 viewWillAppear 中,添加以下内容。当带有搜索控制器的视图控制器到达导航堆栈的顶部时,这使得搜索栏可见。表格的第一行位于搜索栏下方。

    searchController.searchBar.isHidden = false
    

    在 willMove(toParentViewController:) 中,添加以下内容。这会取消任何活动搜索,防止搜索栏出现在导航堆栈顶部的视图控制器上。

    if parent == nil 
        searchController.isActive = false
    
    

【讨论】:

【参考方案2】:

这对我有用:

self.extendedLayoutIncludesOpaqueBars = true

【讨论】:

以上是关于搜索控制器处于活动状态时出现表格视图时隐藏的第一行的主要内容,如果未能解决你的问题,请参考以下文章

在搜索栏处于活动状态时删除表格视图中的单元格 - CoreData 错误

使用搜索栏时无法使表格视图处于非活动状态。苹果手机

当 UISearchController 处于活动状态时呈现 UIAlertController

UISearchController 搜索栏在活动时与第一个单元格重叠

UISearchBar 在活动时与 UITableView 内容重叠

在 UISearchController 处于活动状态时选择 tableview 中的单元格,不显示下一个视图?