如何关闭UISearchController?(iOS 8及更高版本)


71

这一定是微不足道的,但是我找不到您应该如何以编程方式关闭UISearchController?

请注意,它是新的UISearchController(于2014年在iOS 8中引入),而不是UISearchDisplayController。

到目前为止,这就是我所拥有的

// Dismiss the search tableview
searchController.dismissViewControllerAnimated()
// Clear the Search bar text
searchController.active = false

但我仍然有“取消”按钮,无法摆脱它。

Answers:


180

好的,因此在进行了更多测试之后,您只需要设置:

searchController.active = false
// or swift 4+
searchController.isActive = false

这是我尝试的第一件事,但是我在一个不起作用的UISearchControllerDelegate方法中调用了它(可能应该使用dispatch_async对其进行了调用(halbano的回答似乎证实了这一点))。

无论如何,由于我无法在线找到答案,所以我正在回答自己的问题,希望对您有所帮助。


1
这实际上有效!Idk仅更改变量实际上如何触发UI重绘,但是它起作用
Bhargav

1
@Bhargav最有可能是因为正在进行一些KVO(关键价值观察)
Arnaud

1
加上它调用UISearchControllerDelegatedidDismissSearchController(searchController)方法。
Murray Sagal

22

当您尝试切换到其他视图后解雇搜索控制器时,是否遇到了这个问题?我也遇到了这个问题。我想你可能想用

self.definesPresentationContext = true 

在按此文章介绍UISearchController的视图控制器中,按下View时不会关闭UISearchController。这个对我有用。


11

我正在展示嵌入在导航栏上的地雷。对我有用的代码是:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.searchController setActive:NO];
        self.navigationController.navigationBar.topItem.title = @"MYTITLE".uppercaseString;
        self.navigationItem.titleView = nil;
    });
}

希望它能帮助某人。


3
没有确切的代码,但是调度异步将我指向了正确的方向!
kennydust

好!还必须使处理UI元素的主线程是强制性的,也许这是魔术。
halbano

2
@halbano在主线程上调用此委托方法。我相信搜索栏动画与侦听器在此处所做的任何操作之间都存在串扰,这是造成冲突的原因。这将在下一个运行循环中执行响应代码。
斯蒂芬·保罗


1

我在使用search和interactionController时遇到了这个问题,仅在添加以下行后就解决了:self.dismissViewControllerAnimated(false,完成:无)

打开交互并清除搜索,而无需在委托中进行任何更改。


1
问题是这不会触发某些委托函数,例如willDismissSearchController可能需要的。
aasatt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.