如何在iOS 8及以上版本中取消UISearchController?

76

这个问题可能很简单,但我找不到如何以编程方式解除UISearchController的方法?请注意,这是新的UISearchController(在iOS 8中引入),而不是UISearchDisplayController。

到目前为止,这是我得到的:

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

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

5个回答

186

好的,经过更多测试,发现你只需要设置:

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

这是我尝试的第一件事,但我在UISearchControllerDelegate方法之一中调用它,但没有起作用(也许应该使用dispatch_async进行调用,halbano的答案似乎证实了这一点)。

无论如何,由于我在网上找不到答案,所以我回答了自己的问题,希望能帮助到其他人。


1
这真的有效!我不知道只是改变一个变量就能触发UI重绘,但它确实起作用。 - Bhargav
1
@Bhargav 很可能是因为有一些KVO(键值观察)正在进行。 - Arnaud
1
此外,它调用了 UISearchControllerDelegatedidDismissSearchController(searchController) 方法。 - Murray Sagal

25

当你试图在切换到另一个视图后关闭搜索控制器时,你是否遇到了这个问题?我也遇到了这个问题。我认为你可能想使用

self.definesPresentationContext = true 

按照这篇文章UISearchController not dismissed when View is pushed,在呈现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 这个委托方法在主线程上被调用。我相信搜索栏动画和监听器在这里所做的任何事情之间存在交叉对话,这是冲突的原因。这将在下一个运行循环中执行响应代码。 - Stephen Paul

7

SWIFT 4+

searchController.isActive = false

1
我在使用搜索和interactionController时遇到了问题,只需加入以下代码即可解决:self.dismissViewControllerAnimated(false, completion: nil)。
打开interaction并清除搜索,无需更改委托。

1
问题在于这不会触发一些委托函数,比如 willDismissSearchController,这可能是必要的。 - aasatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接