我有一个应用程序,通常在整个应用程序中列出Wines(全屏或更小的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
这很棒,但现在我正在构建一个搜索方面,我想使用相同的Viewcontroller来显示结果,因为我在cellForRowAtIndexPath中有一些复杂的规则等等。
但是,UISearchDisplayController想要使用自己的tableView,这意味着我必须从WineListViewController(heightForRow,cellForRow)复制我的所有代码,只是为了显示相同的方式。 有没有办法可以将WineListViewController连接到UISearchDisplayController,这样我就不会复制代码?
答案 0 :(得分:2)
是
您需要设置 UISearchDisplayController 的 searchResultsDataSource 和 searchResultsDelegate 以指向 WineListViewController 的实例(你可以在 WineListViewController 中的适当位置执行此操作,并简单地传递'self'。 UISearchDisplayController 的这两个属性与 UITableView 的属性 dataSource 和 delegate 完全相同。 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的委托方法,因为您可以实现这些方法来指定何时应该刷新搜索显示结果表等等。