iOS — использование UISearchDisplayController в UITableViewController со статическими ячейками

У меня возникли проблемы с боковой панелью в этом приложении (которое использует раскадровку), над которым я работаю. Боковая панель представляет собой UITableViewController, и мне нужна панель поиска вверху, поэтому я поместил объект Search Bar and Search Display Controller в раскадровку. У меня есть содержимое боковой панели в 5 статических ячейках, а панель поиска выполняет поиск в удаленной базе данных для получения результатов.

Моя проблема в том, что если мои результаты поиска содержат более 5 элементов, я получаю следующую ошибку:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 5 beyond bounds [0 .. 4]'

Я не совсем уверен, что происходит за кулисами, но я совершенно уверен, что, несмотря на следующий код, количество строк, заданное для раздела табличного представления в Storyboard (5), переопределяет все.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [[self filteredCappegoryArray] count];
    } else {
        return [super tableView:tableView numberOfRowsInSection:0];
    }
}

Я бы переключил боковую панель на использование динамических ячеек, но одна из моих ячеек содержит представление контейнера, а XCode не позволяет мне иметь представление контейнера в ячейке-прототипе. Мне было интересно, есть ли какие-либо варианты, которые я должен обойти эту проблему.


person kevin    schedule 27.01.2014    source источник


Ответы (2)


Мне удалось решить ошибку с помощью коллеги. Уделив больше внимания стеку вызовов, мы поняли, что приложение аварийно завершает работу в методе источника данных (индекс 3).

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 5 beyond bounds [0 .. 4]'
*** First throw call stack:
(
0   CoreFoundation                      0x000000010188c795 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x00000001015ef991 objc_exception_throw + 43
2   CoreFoundation                      0x000000010184502f -[__NSArrayI objectAtIndex:] + 175
3   UIKit                               0x00000001006d97df -[UITableViewDataSource tableView:indentationLevelForRowAtIndexPath:] + 115
4   UIKit                               0x0000000100318a08 __53-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke + 1574
5   UIKit                               0x00000001002a60ac +[UIView(Animation) performWithoutAnimation:] + 70
[...]

Итак, я добавил это, и теперь результаты отображаются отлично.

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 0;
}

Это на самом деле решило две проблемы, так как я заметил, что мои результаты поиска имели разные отступы, прежде чем добавить этот метод.

person kevin    schedule 28.01.2014
comment
Эй, очень рад, что вы опубликовали это исправление indentationLevelForRowAtIndexPath. Я отлаживал в течение нескольких часов. - person John Erck; 29.05.2014
comment
Большое спасибо за публикацию решения для этого. У меня была такая же проблема, и я потратил пару часов на отладку проблемы. Еще раз Спасибо! - person Guerrix; 14.10.2014

Вы можете переопределить:

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

И возвращать пользовательский UITableViewCell в некоторых случаях и вызывать super в других, точно так же, как вы переопределили numberOfRowsInSection

person EsbenB    schedule 27.01.2014
comment
Да я уже так делаю. Все ячейки отображаются правильно, единственная проблема заключается в том, что табличное представление отказывается разрешать больше ячеек, чем число, установленное в настройках раскадровки. - person kevin; 28.01.2014