Сбой ios 5 UISearchDisplayController - PullRequest
       17

Сбой ios 5 UISearchDisplayController

24 голосов
/ 09 ноября 2011

Я реализую UITableView с UISearchDisplayController в xcode 4.2. UITableView и UISearchDisplayController создаются в StoryBoard. Я устанавливаю идентификатор ячейки (SampleCell) для UITableView и обращаюсь к нему как

cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell"];

UItableView работает нормально. Но как только я пытаюсь выполнить поиск, приложение вылетает с ошибкой ниже.

*** Assertion failure in -[UISearchResultsTableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableView.m:6072
2011-11-09 22:22:16.058 SampleApp[14362:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Полагаю, мне нужно установить идентификатор ячейки для ячейки self.searchDisplayController.searchResultsTableView. Но я не знаю как. Заранее благодарю за любую помощь. =)

Ответы [ 4 ]

83 голосов
/ 16 марта 2012

Используйте [self.tableView dequeue...], а не [tableView dequeue...].

Ячейка, которую вы пытаетесь удалить из очереди, связана с tableView вашего основного контроллера представления в раскадровке, а не с недавно созданным searchDisplayControllertableView (с которой не связаны идентификаторы ячеек).Если вы просто сообщаете «tableView», то ваше сообщение об удалении отправляется в searchDisplayController's tableView, поскольку это то, что было передано в метод cellForRowAtIndexPath: ....

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CellId"];

    // do your thing

    return cell;
}
16 голосов
/ 28 ноября 2011

Действительно, трудно отследить ошибку, кажется, что каждый раз, когда вы выполняете поиск, создается новое табличное представление.Это означает, что регистрация вашей ячейки должна быть удалена из ViewDidLoad, поскольку это будет работать только для первого поиска.Вместо этого используйте следующий метод делегата для регистрации и настройки ячейки:

    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    [self.searchDisplayController.searchResultsTableView 
     registerNib:[UINib nibWithNibName:@"YOURCELLNIB" bundle:nil] forCellReuseIdentifier:@"YOURCELLID"];
    self.searchDisplayController.searchResultsTableView.separatorColor = [UIColor clearColor];
}
10 голосов
/ 27 марта 2013

(Ответ, который рекомендует использовать self.tableview, зависит от другого табличного представления. Это самое чистое решение и может использоваться, даже если контроллер поиска используется сам по себе.)

Вам нужно зарегистрировать ячейки в UITableView UISearchDisplayController.Лучший способ сделать это - зарегистрировать ячейки при загрузке этого табличного представления.

У UISearchDisplayDelegate есть метод, который уведомляет вас о загрузке табличного представления - точно так же, как viewDidLoad, но для представления таблицы поиска.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    [tableView registerNib:[UINib nibWithNibName:@"MyCellNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"MyCellIdentifier"];
}
0 голосов
/ 27 сентября 2013

Вы можете в

- (void)searchDisplayController:(UISearchDisplayController *)searchDisplayController didLoadSearchResultsTableView:(UITableView *)searchResultsTableView

до

[searchResultsTableView registerNib:[UINib nibWithNibName:@"someNibName" bundle:nil] forCellReuseIdentifier:@"yourReuseId"];

Тогда вы можете использовать в

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

нормальный

[tableView dequeueReusableCellWithIdentifier:

...