我想在带有MKMapView的自定义UIViewController中使用UISearchDisplayController。
我在导航栏中显示UISearchBar。
所有适用于iPhone,但在iPad上,即使在弹出式窗口中,也无法显示TableView的结果......我只想显示此表格...
(所有代表都已初步完成)
通过调试,我知道TableView存在(searchDisplayController中有一个地址)
self.searchDisplayController.searchResultsTableView;
编辑:
我在Interface Builder中设置了所有内容,但在导航栏中插入了searchBar。我只是以编程方式做到了:
self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
我不明白,为什么在iPhone中显示tableView而不是iPad!
编辑2:
如果我将插入删除到导航栏(上面引用的最后一行代码),则会显示tableView,但是全屏而不是弹出窗口。
最终编辑:
没有解决方案,我尝试的方式不同:我将我的视图嵌入到SplitView中,在主视图中使用Research,在detailView中使用MapView。它有效,但看起来与预期不同。
和答案是:
使用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!)
}
答案 0 :(得分:2)
@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;
}
答案 1 :(得分:1)
我遇到了同样的问题。部分解决方案是实施
- (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
不幸的是,还有一个小问题 - 当用户开始在搜索框中输入时,键盘会在输入第一个字符后被解雇(对我而言)。
答案 2 :(得分:-1)
这解决了我的问题。
UISearchBar *searchBar = [UISearchBar new];
searchBar.delegate = self;
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
然后不要将SearchBarInNavigationBar显示为YES