UISearchDisplayController不会在iPad上显示结果表视图

时间:2014-05-08 22:04:19

标签: ios objective-c ipad swift uisearchdisplaycontroller

我想在带有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!)
    }

3 个答案:

答案 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