你如何解除 UISearchController ? (iOS 8 及以下)
Posted
技术标签:
【中文标题】你如何解除 UISearchController ? (iOS 8 及以下)【英文标题】:How do you dismiss a UISearchController ? (iOS 8 and follow) 【发布时间】:2015-02-10 17:48:29 【问题描述】:这一定很简单,但我找不到您应该如何以编程方式关闭 UISearchController?
请注意,它是新的 UISearchController(2014 年随 ios 8 推出),而不是 UISearchDisplayController。
到目前为止,这就是我所拥有的
// Dismiss the search tableview
searchController.dismissViewControllerAnimated()
// Clear the Search bar text
searchController.active = false
但我还有取消按钮,无法摆脱它。
【问题讨论】:
【参考方案1】:好的,经过更多的测试,结果你只需要设置:
searchController.active = false
// or swift 4+
searchController.isActive = false
这是我尝试的第一件事,但我在其中一个不起作用的 UISearchControllerDelegate 方法中调用了它(可能应该使用 dispatch_async 调用它(halbano 的回答似乎证实了这一点))。
无论如何,由于我在网上找不到该答案,所以我正在回答我自己的问题,希望对某人有所帮助。
【讨论】:
这确实有效!我知道只是更改变量实际上会触发 UI 重绘,但它可以工作 @Bhargav 很可能是因为正在进行一些 KVO(键值观察) 另外它调用UISearchControllerDelegate
的didDismissSearchController(searchController)
方法。【参考方案2】:
当您在切换到另一个视图后尝试关闭搜索控制器时,您是否遇到过这个问题?我也遇到过这个问题。我想你可能想使用
self.definesPresentationContext = true
在根据这篇文章UISearchController not dismissed when View is pushed 呈现 UISearchController 的视图控制器中。它对我有用。
【讨论】:
【参考方案3】:我在导航栏上展示了我的嵌入。对我有用的代码是:
- (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;
);
希望对某人有所帮助。
【讨论】:
不是确切的代码,但调度异步为我指明了正确的方向! 好!还要让主线程来处理 UI 元素是强制性的,也许这就是魔法。 @halbano 这个委托方法在主线程上被调用。我相信搜索栏动画与听众在这里所做的任何事情之间存在串扰,这是冲突的原因。这将在下一个运行循环中执行响应代码。【参考方案4】:SWIFT 4+
searchController.isActive = false
【讨论】:
【参考方案5】:我在使用搜索和交互控制器时遇到了这个问题,只需包含以下行即可解决: self.dismissViewControllerAnimated(false, completion: nil)
打开交互并清除搜索而不更改委托。
【讨论】:
问题是这不会触发像willDismissSearchController
这样可能是必要的委托函数。以上是关于你如何解除 UISearchController ? (iOS 8 及以下)的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationBar 在解除 UISearchController 时覆盖 UITableView
你如何使用 Storyboards 引用 UISearchController
UISearchController - 警告尝试加载视图控制器的视图