在我的应用程序中,我使用UISearchController(iOS 8中的新增功能)来显示搜索结果.有没有办法显示一组默认结果,当用户点击searchBar而不输入任何内容时会显示这些结果?
我找到了一些关于这个主题的问题和答案,但他们都使用旧的UISearchDisplayController,我似乎无法使用UISearchController解决方案.
谢谢
我想将UISearchBar添加到已经具有标题视图的UITableView.当我尝试将搜索栏添加到现有的标题视图时,它一直有效,直到我点击它,此时我得到The view hierarchy is not prepared for the constraint,这似乎是因为搜索栏不是tableview的直接子视图,所以当UISearchController尝试更新时它不能的约束.
我找到的唯一方法是将表视图标题作为搜索栏,然后一切正常,但当然我丢失了标题视图中已有的其他视图.
我实现了一个UITableViewController的搜索功能,如下所示:
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,如果我点击它,我的导航栏和我的navigationcontrollers标题就会消失.是否有解决方案来阻止这种行为(在swift中)?
没有点击:

点击:

它怎么UISearchController做呢?
UISearchBar为类似导航栏的视图?UISearchBar放入另一个视图层次结构并在以后恢复?UIViewController表示API 完成所有这些的?我可以在UISearchController不使用私有API 的情况下自行创建吗?
我在界面构建器中添加了一个搜索栏和搜索显示控制器到我的应用程序.我无法正确地进行deinit(dealloc).
它显示以下行为(swift2,ios9):
如果我在导航控制器中选择"返回"而不是选择项目,则会出现相同的行为.
code removed - refer to COMPLETE CODE at bottom of post.
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏!
更新进一步测试表明,从视图控制器中删除progressHud/loadingHud完全没有影响DEINIT没有被调用.它必须与tableview或searchcontroller本身有关...
更新2我尝试在viewWillDissapear中调用searchBarCancelButtonClicked()方法,但仍然没有释放.即使你点击"取消"然后导航它就会......
更新3将willDisappear/didDisappear更改为以下对DEINIT没有影响 - 但不会给出错误的界面问题(感谢Polina).我试图找出我能发布的任何东西,但到目前为止还没有运气.
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
searchBarCancelButtonClicked(searchController.searchBar)
}
override func viewDidDisappear(animated: Bool) {
print("View did disappear")
searchController.searchBar.resignFirstResponder()
searchController.searchBar.endEditing(true)
searchController.active = false
loadingHud.removeFromSuperview()
progressHud.removeFromSuperview()
searchController.searchBar.delegate = nil
searchController.searchResultsUpdater = nil
searchController = nil
tableView = nil
super.viewDidDisappear(true)
}
Run Code Online (Sandbox Code Playgroud)
更新4我找不到答案.真的希望有人可以帮忙!
更新5响应@ConfusedByCode - 我更新了以下方法,以便[unowned self] in在所有闭包或后台线程操作中使用:
code removed - …Run Code Online (Sandbox Code Playgroud) 我已将搜索栏添加到我的tableview.But当我在我的表视图中搜索一些东西,如果我按下取消默认按钮搜索栏以解除我的键盘意味着我的应用程序崩溃.
崩溃报告:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIFullscreenPresentationController adaptivePresentationController]: unrecognized selector sent to instance 0x7ff10a88cd80'
*** First throw call stack:
(
0 CoreFoundation 0x000000010b18ed85 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010ca8adeb objc_exception_throw + 48
2 CoreFoundation 0x000000010b197d3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010b0ddcfa ___forwarding___ + 970
4 CoreFoundation 0x000000010b0dd8a8 _CF_forwarding_prep_0 + 120
5 UIKit 0x000000010dfda4c2 -[UISearchController _searchPresentationController] + 134
6 UIKit 0x000000010db8ad77 -[_UISearchControllerTransplantSearchBarAnimator animateTransition:] + 215
7 UIKit 0x000000010d6f148f __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 2638
8 UIKit 0x000000010d58ef62 …Run Code Online (Sandbox Code Playgroud) 我的tableview标题中有一个搜索栏.为此,我正在使用uisearchcontroler.但是当我在搜索栏中发短信时它会更新tablview数据,我需要在点击键盘上的搜索按钮时更新tablview,因为我在api中获取搜索数据,每次当我在搜索栏中发短信时它都会请求并且需要很长时间.我怎么解决这个问题?
var resultSearchController = UISearchController()
var indicator:UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
var ref=UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
indicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
indicator.center = view.center
view.addSubview(indicator)
indicator.bringSubviewToFront(view)
indicator.startAnimating()
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
getRequests.getType1(tableView,spinner: indicator)
ref.addTarget(self, action: #selector(Catalog1TableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
ref.attributedTitle = NSAttributedString(string: "????????")
tableView.addSubview(ref)
}
func updateSearchResultsForSearchController(searchController: UISearchController)
{
indicator.startAnimating()
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
tableView.reloadData()
getRequests.getProduct(tableView, spinner: indicator,name: searchController.searchBar.text!)
for …Run Code Online (Sandbox Code Playgroud) 有没有人成功地保留了UISearchBar在tableHeaderView一个UITableView在ios11?iPhone X在景观中通常会出现问题:
Apple建议使用新searchController属性:
if (@available(iOS 11.0, *)) {
self.navigationItem.searchController = self.searchController;
self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
self.tableView.tableHeaderView = self.searchController.searchBar;
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不总是有效.这是一个代码示例:
嵌入UISplitViewController时,UINavigationBar中缺少iOS11 UISearchBar
所以,试图保持searchBar在tableHeaderView-切实可行的第一步是应用适当的自动布局限制:
if (@available(iOS 11.0, *)) {
UILayoutGuide *guide = self.tableView.safeAreaLayoutGuide;
searchBar.translatesAutoresizingMaskIntoConstraints = NO;
[searchBar.leftAnchor constraintEqualToAnchor:guide.leftAnchor].active = YES;
[searchBar.rightAnchor constraintEqualToAnchor:guide.rightAnchor].active = YES;
}
Run Code Online (Sandbox Code Playgroud)
在searchBar显示时,那么正确的尺寸:
但是,UISearchBar激活时会出现问题:
这似乎是一个老问题.有许多stackoverflow问题和答案与这样的问题有关.在这种情况下,在检查视图层次结构时,似乎设置的宽度UISearchBar不正确.所以这可以纠正:
- (void)didPresentSearchController:(UISearchController *)searchController NS_AVAILABLE_IOS(11_0)
{
if (@available(iOS 11.0, *)) {
CGRect frame = …Run Code Online (Sandbox Code Playgroud) 我想实现UISearchController,使用本教程一步一步:
使用MKLocalSearchRequest搜索地点并使用UISearchController显示结果
在本节中......
...我在步骤3中遇到问题.设置表视图数据源
extension LocationSearchTable {
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return matchingItems.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell")!
let selectedItem = matchingItems[indexPath.row].placemark
cell.textLabel?.text = selectedItem.name
cell.detailTextLabel?.text = ""
return cell
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试override从cellForRowAtindexPathtableView函数中删除,在这种情况下我在Xcode中没有错误,但执行后出错:
Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'UITableView (<UITableView: 0x7ff8e03a3800; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H;
gestureRecognizers = <NSArray: …Run Code Online (Sandbox Code Playgroud) 当我将项目更新到iOS 13时,我遇到了异常问题。我有显示和处理某些UISearchController动作的逻辑(下面的代码),所有部分在iOS 11和12中均正常运行。
我的任务是在导航栏中添加搜索按钮,以UISearchController在按钮操作后显示。
但是在iOS 13中,我遇到了2个问题:
从按钮动作调用的代码
func showSearch() {
let searchResultsController = LUSearchResultsViewController()...
let searchController = UISearchController(searchResultsController: searchResultsController)
searchController.delegate = self
searchController.searchResultsUpdater = searchResultsController
navigationItem.searchController = searchController
definesPresentationContext = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchController.isActive = true
}
}
Run Code Online (Sandbox Code Playgroud)
只有一种解决方案可以帮助我显示搜索控制器,而与以前的iOS版本没有任何区别。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchController.isActive = true
}
Run Code Online (Sandbox Code Playgroud)
在iOS 13,iOS 11和12上运行的代码无需asyncAfter
帮助我隐藏UISearchController和设置iOS 11和12(而非13)中的导航栏初始状态的代码。在SearchBar上点击“ 取消 ” 后,UISearchController开始调用委托方法。
//MARK: UISearchControllerDelegate
public func willDismissSearchController(_ searchController: UISearchController) {
self.navigationItem.searchController = …Run Code Online (Sandbox Code Playgroud) ios ×9
swift ×6
ios8 ×3
uitableview ×3
uisearchbar ×2
cocoa-touch ×1
header ×1
ios11 ×1
ios13 ×1
mapkit ×1
objective-c ×1
retain ×1
swift5 ×1
uikit ×1