【问题标题】:Use existing tableView and ViewController with UISearchDisplayController将现有的 tableView 和 ViewController 与 UISearchDisplayController 一起使用
【发布时间】:2011-08-13 23:41:08
【问题描述】:

我有一个应用程序,通常会在整个应用程序(全屏或较小的 UIViews)中列出葡萄酒。我通常调用这个 ViewController,分配视图,将委托/等分配给我的主 ViewController,然后通过该委托填充数据。

来自想要在屏幕上显示葡萄酒的主视图:

wineListViewController = [[WineListViewController alloc] initWithWines:nil];
wineListViewController.navigationController = self.navigationController;
self.winesTableView.dataSource = wineListViewController;
self.winesTableView.delegate = wineListViewController;
// Table population code goes here

这很好,但现在我正在构建一个搜索方面,我想使用同一个 Viewcontroller 来显示结果,因为我在 cellForRowAtIndexPath 等中有一些复杂的规则。

但是,UISearchDisplayController 想要使用自己的 tableView,这意味着我必须从 WineListViewController (heightForRow,cellForRow) 复制我的所有代码才能以相同的方式显示。 有没有办法可以将 WineListViewController 连接到 UISearchDisplayController,这样我就不会重复代码?

【问题讨论】:

    标签: objective-c ios uisearchdisplaycontroller


    【解决方案1】:

    是的。

    您需要将 UISearchDisplayControllersearchResultsDataSourcesearchResultsDelegate 设置为指向您的 WineListViewController 的实例(您可以在 WineListViewController 的适当位置执行此操作,然后简单地传递“self”。 UISearchDisplayController 的这两个属性与 UITableView 的属性 dataSourcedelegate 完全相同。 UISearchDisplayController 将在您的原始 UITableView 上显示一个 UITableView,并且使用这些属性,您可以指定应为特定搜索字符串显示哪些结果(就像您对原始表格一样)。每次更改字符串时都应重新加载搜索结果表视图,并且将调用您的 UITableView 数据源和委托方法。

    您可以区分标准 UITableView 和数据源中的 searchResultsTableView 以及 WineListViewController 的委托方法,如下所示(例如):

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (tableView == self.tableView)
        {
            // Return a standard listing for indexPath.
        }
        else if (tableView == self.searchDisplayController.searchResultsTable)
        {
            // Return a filtered cell, based on a filtered model of the searchDisplayController's searchBar's search string.
        }
    }
    

    Y 应该看看 UISearchDisplayController 的委托方法,因为您可以实现这些方法来指定何时刷新搜索显示结果表等。

    【讨论】:

    • 那是一个很棒的回复,谢谢。我实际上已经把它连接起来了,但是一旦数据到达,我需要提醒重新加载 tableView。对于下一个阅读此内容的人,在我上面发布的代码之后这是必要的:self.searchDisplayController.searchResultsDataSource = wineListController; self.searchDisplayController.searchResultsDelegate = wineListController;SearchResultsDone 你应该有:wineListController.currentWines=resultArray; [self.winesTableView reloadData];
    猜你喜欢
    • 2012-01-08
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多