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 搜索栏

iphone隐藏UISearchDisplayController结果?

在 UISearchDisplayController 中设置 UISearchBar 的边框颜色