【问题标题】:UISearchDisplayController doesn't display the result tableview on iPadUISearchDisplayController 不在 iPad 上显示结果表视图
【发布时间】:2023-04-09 06:09:01
【问题描述】:

我想在带有 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?

标签: ios objective-c ipad swift uisearchdisplaycontroller


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多