Это интересный. Длинный ответ заключается в том, что searchBarTextDidBeginEditing:
вызывается после tableView:numberOfRowsInSection:
, но до tableView:cellForRowAtIndexPath:
. В результате tableView
ожидает [listOfItems count]
количество строк, но к моменту вызова tableView:cellForRowAtIndexPath:
searching
BOOL равно YES
, поэтому контроллер представления использует copyListOfItems
для заполнения таблицы, что, конечно, не содержит достаточного количества объектов для заполнения таблицы.
Короткий ответ: перестаньте говорить контроллеру вида, который вы ищете, пока вы не ищете; Установите searching = YES;
, когда есть фактический текст, который вы используете для поиска, а не только тогда, когда searchBar
является первым респондентом.
Действительно короткий ответ:
- (void) searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar {
// Comment this assignment out
//searching = YES;
}
Кажется, он работает нормально.
Несколько советов по такому сценарию:
1) Посмотрите на напечатанную трассировку стека в вашей консоли. Это позволило бы вам увидеть, что проблема была:
'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
2) Используйте NSLog
s обильно; Я считаю наиболее полезным:
NSLog(@"%@",NSStringFromSelector(_cmd));
Редактировать В ответ на несимвольную трассировку стека в консоли (т. Е. 0x14d3ec9 0x36e5c2
):
3) Использовать точку останова исключения; как на фото:
4) Добавить необработанный обработчик исключений; Как описано здесь .