UISearchDisplayController 不在 iPad 上显示结果表视图
Posted
技术标签:
【中文标题】UISearchDisplayController 不在 iPad 上显示结果表视图【英文标题】:UISearchDisplayController doesn't display the result tableview on iPad 【发布时间】:2014-05-08 22:04:19 【问题描述】:我想在带有 MKMapView 的自定义 UIViewController 中使用 UISearchDisplayController。
我在导航栏中显示 UISearchBar。
所有的作品在 iPhone 上,但在 iPad 上,结果的 TableView 不显示,即使在弹出框...我只想显示这个 tableview...
(所有委托均已初始化)
通过调试,我知道TableView存在(在searchDisplayController中有地址)
self.searchDisplayController.searchResultsTableView;
编辑:
我在 Interface Builder 中进行了所有设置,除了在导航栏中插入 searchBar。我只是以编程方式完成的:
self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
我不明白,为什么在 iPhone 中显示 tableView 而在 iPad 中却没有!
编辑 2:
如果我删除导航栏的插入(上面引用的最后一行代码),tableView 会显示,但全屏显示而不是弹出窗口。
最终编辑:
没有解决方案,我尝试了不同的方法:我将视图嵌入到 SplitView 中,Research 位于主视图中,MapView 位于 detailView 中。它有效,但看起来与预期不同..
答案是:
使用 swift 和 ios 8,我重新构建了我的应用程序,并找到了一个很好地完成这项工作的解决方案。
if let tableView = self.searchDisplayController?.searchResultsTableView
tableView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.bounds.width, height: self.view.bounds.height)
self.view.addSubview(self.blurEffectView!)
【问题讨论】:
这一切是如何设置的?通过代码还是IB? 【参考方案1】:@Jeremy 感谢您的回答。我是 iOS 新手,您的回答帮助我摆脱了这个问题。这是一个可能对其他人有帮助的更新。
在 ViewDidLoad 中包含这段代码以保存原始视图的副本
originalView = self.view;
为 searchDisplayController 添加以下两个委托方法将解决您的问题。 如果您将 searchBar 放在 NavigationBar 中,请使用
UIEdgeInsetsMake(70, 0, 0, 0)
其他使用UIEdgeInsetsZero
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
if (OSVersionIsAtLeastiOS7() && (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad))
if (([originalView isEqual:self.view]))
self.view = controller.searchResultsTableView;
controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(70, 0, 0, 0);
[self.searchDisplayController.searchBar becomeFirstResponder]; // This will retain the keyboard after keypress
要随时显示原始视图,请使用self.view = originalView;
在我使用的这个委托方法中,如果搜索文本为空,则显示原始视图而不是黑屏。
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
if ([searchString isEqualToString:@""])
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
self.view = originalView;
else
[self filterContentForSearch:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
originalView.alpha = 0.5f;
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
originalView.alpha = 1.0f;
【讨论】:
【参考方案2】:我也有同样的问题。部分解决方案是实施
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
if (OSVersionIsAtLeastiOS7() && IPAD) // These are custom methods I have in my .pch file
self.view = controller.searchResultsTableView;
controller.searchResultsTableView.contentInset = UIEdgeInsetsZero;
在此处找到此解决方案:http://www.objc.io/issue-5/iOS7-hidden-gems-and-workarounds.html
不幸的是,仍然存在一个小问题 - 当用户开始在搜索框中输入时,键盘在输入第一个字符后被关闭(对我来说)。
【讨论】:
感谢您的回答。对于 iOS 8,我想我会以不同的方式使用新的 UISearchController :)【参考方案3】:这解决了我的问题。
UISearchBar *searchBar = [UISearchBar new];
searchBar.delegate = self;
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
然后不显示SearchBarInNavigationBar为YES
【讨论】:
以上是关于UISearchDisplayController 不在 iPad 上显示结果表视图的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UISearchDisplayController 有时有效,有时无效?
iOS UISearchDisplayController学习笔记
在 UISearchDisplayController 上遇到僵尸问题
修复 UITableView 顶部的 UISearchdisplaycontroller 搜索栏