当UISearchController处于活动状态时,iOS 9 searchBar将从表头视图中消失

Dav*_*ang 53 uisearchbar ios swift uisearchcontroller ios9

结构:

View1(单击按钮) - >以模态方式呈现(MyModalView:UITableViewController)

MyModalView嵌入了UISearchController.UISearchController的searchBar放在MyModalView.tableView.tableHeaderView中.

自iOS 8.0起,它一直运行良好.但是在iOS 9上,当UISearchController处于活动状态时,searchBar会消失.请看下面这些图片

模态视图:模态视图

UISearchController在iOS 8上处于活动状态:iOS 8中的搜索栏

UISearchController在iOS 9上处于活动状态:iOS 9中的搜索栏

非常标准的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Dynamically create a search controller using anonymous function
    self.resultSearchController = ({
        let controller = UISearchController(searchResultsController: nil)
        controller.searchResultsUpdater = self
        controller.dimsBackgroundDuringPresentation = false

        controller.searchBar.sizeToFit()
        controller.searchBar.delegate = self

        self.tableView.tableHeaderView = controller.searchBar

        return controller
    })()

    // Auto sizing row & cell height
    self.tableView.estimatedRowHeight = 130
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.definesPresentationContext = true

    // No footer for better presentation
    self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
Run Code Online (Sandbox Code Playgroud)

这个问题也发生在iOS 9.1 beta ...

任何想法/指针都将深受赞赏

干杯.

Shw*_*car 68

我不确定究竟是什么问题,但我通过以下方式解决了这个问题:

self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
Run Code Online (Sandbox Code Playgroud)

我的猜测是,UISearchController当它试图呈现为导航栏时,它正在做一些时髦的事情.所以,这是一个黑客,但它至少不会阻止用户.搜索栏不会执行很酷的动画并掩盖导航栏.

  • 只需要第一行`searchController.hidesNavigationBarDuringPresentation = false`(swift) (7认同)

Dav*_*ang 67

似乎我们所有人都遇到了同样的问题,但他们以不同的方式解决了.然而,没有一个建议的答案对我有用:(.尽管如此,谢谢大家的时间.

我找到了解决问题的解决方案.它使用Interface Builder在Storyboard中将我的(MyModalView:UITableViewController)的Opaque Bars下的Extend Edges设置为true.

综上所述:

MyModalView:UITableViewController,在Storyboard中使用Interface Builder

延伸边缘: - 在顶栏下方勾选 - 在底栏下方勾选 - 在不透明栏下勾选

截图


wil*_*uan 36

我发现故事板中的模拟指标(顶部栏)导致了这个问题.在我的情况下,以下几行有效,但我仍然不知道为什么.

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记将searchController委托设置为实现这些方法的类(通常是self) (2认同)

jig*_*zat 19

我不得不

self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一个类似的问题,但在我的情况下,它不在viewDidLoad方法上.我必须尝试不同的观点,直到它奏效.现在我可以同时拥有自定义导航栏颜色和搜索栏,


小智 10

谢谢@wiles duan和@Techprimate

就我而言,我通过设置修复了这个问题:

self.definesPresentationContext = NO;
Run Code Online (Sandbox Code Playgroud)

并在UISearchControllerDelegate中实现以下两个方法

- (void)willPresentSearchController:(UISearchController *)searchController {
    // do something before the search controller is presented
    self.navigationController.navigationBar.translucent = YES;
}

-(void)willDismissSearchController:(UISearchController *)searchController
{
    self.navigationController.navigationBar.translucent = NO;
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*der 6

我通过删除修复了它

definesPresentationContext = true

如果删除这个有任何缺点,我还没有测试!