将现有的tableView和ViewController与UISearchDisplayController一起使用

bee*_*lez 6 objective-c uisearchdisplaycontroller ios

我有一个应用程序,通常在整个应用程序(全屏或较小的UIViews)中列出葡萄酒.我通常通过分配View,将委托/ etc分配给我的主ViewController,然后通过该委托填充数据来正常调用此ViewController.

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

wineListViewController = [[WineListViewController alloc] initWithWines:nil];
wineListViewController.navigationController = self.navigationController;
self.winesTableView.dataSource = wineListViewController;
self.winesTableView.delegate = wineListViewController;
// Table population code goes here
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*ord 2

是的。

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

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

- (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.
    }
}
Run Code Online (Sandbox Code Playgroud)

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