Подтвердить что ты не робот

Ios 5 UISearchDisplayController crash

Я реализую 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. Но я не знаю, как это сделать. Заранее благодарю за любую помощь. =)

4b9b3361

Ответ 1

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

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

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

    // do your thing

    return cell;
}

Ответ 2

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

    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    [self.searchDisplayController.searchResultsTableView 
     registerNib:[UINib nibWithNibName:@"YOURCELLNIB" bundle:nil] forCellReuseIdentifier:@"YOURCELLID"];
    self.searchDisplayController.searchResultsTableView.separatorColor = [UIColor clearColor];
}

Ответ 3

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

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

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

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    [tableView registerNib:[UINib nibWithNibName:@"MyCellNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"MyCellIdentifier"];
}

Ответ 4

Вы можете в

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

do

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

Затем вы можете использовать в

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

нормальный

[tableView dequeueReusableCellWithIdentifier: