Используйте существующие tableView и ViewController с UISearchDisplayController - PullRequest
6 голосов
/ 14 августа 2011

У меня есть приложение, которое обычно перечисляет вина по всему приложению (в полноэкранном режиме или в небольших UIViews). Я обычно вызываю этот ViewController, выделяя View, назначая делегат / etc моему основному 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, чтобы я не дублировал код?

1 Ответ

2 голосов
/ 14 августа 2011

Да.

Вам необходимо установить searchResultsDataSource и searchResultsDelegate UISearchDisplayController , чтобы указать на экземпляр вашего WineListViewController (вы можете сделать это в соответствующем месте в WineListViewController и просто передать 'self'. Эти два свойства UISearchDisplayController в точности совпадают со свойствами dataSource и делегат UITableView . UISearchDisplayController собирается представить UITableView поверх вашего исходного UITableView, и с помощью этих свойств вы можете указатькакие результаты должны отображаться для конкретной строки поиска (так же, как и в исходной таблице). Представление таблицы результатов поиска следует перезагружать при каждом изменении строки, и будут вызываться ваши источник данных UITableView и методы делегата.

Вы можете различить ваш стандартный UITableViewи searchResultsTableView в вашем источнике данных и методах делегирования o 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, поскольку вы можете реализовать их, чтобы указать, когда поискнеобходимо обновить таблицу результатов и т. д.

...