У меня есть два источника данных для моего UITableView и моего вида таблицы SearchDisplayController. Я переключаюсь между массивами на основе свойства self.isSearching. Кажется, что это хорошо работает, но когда я использую кнопку «Назад» из подробного представления, которое было нажато из ссылки на результат поиска, представление таблицы по умолчанию, похоже, повторно загружается в представлении таблицы результатов поиска, что приводит к ошибке за пределами границ на массив (потому что в таблице по умолчанию больше результатов, чем таблица результатов поиска).Оригинальный UITableView перезагружается под searchDisplayController
Почему эта таблица перезагружается вообще? Я явно перезаряжаю таблицу поиска, когда возвращается viewWillAppear.
Это кажется ошибкой для меня, я бы предположил, что только что сфокусированная таблица результатов поиска должна быть перезагружена, если что-нибудь? Как я могу вернуть результат из 0 строк из numberOfRowsInSection, если мне это нужно для номеров результатов поиска?
Вот мои методы и журналы.
- (NSMutableArray*)cachePointer
{
if (self.isSearching){
return self.searchTitles;
}else{
return self.titles;
}
}
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"%@", NSStringFromSelector(_cmd));
[super viewWillAppear:animated];
if (self.isSearching) {
[self.searchResultsController.tableView reloadData];
} else {
[self.tableView reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"%@ %ld", NSStringFromSelector(_cmd), [self.cachePointer count]);
return [self.cachePointer count];
}
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%@, tableView: %@", NSStringFromSelector(_cmd), tableView);
NLSTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TitleCellIdentifier"];
NSInteger rowAtIndex = 0;
if (![self.cachePointer objectAtIndex:indexPath.row]){
NSLog(@"[self.cachePointer objectAtIndex:%ld = nil", indexPath.row);
if (self.isSearching) {
[self updateSearchResultsForSearchController:self.searchController];
} else {
[self primeTitleCache];
}
} else {
NSLog(@"[self.cachePointer objectAtIndex:%ld = %ld", indexPath.row, [[self.cachePointer objectAtIndex:indexPath.row] integerValue]);
rowAtIndex = [[self.cachePointer objectAtIndex:indexPath.row] integerValue];
}
if (!cell) {
NSLog(@"no cell to re-use. self.isSearching = %d", self.isSearching);
cell = [[NLSTableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"TitleCellIdentifier"
andId:rowAtIndex];
} else {
NSLog(@"re-using cell at indexPath %ld, pulling %ld", indexPath.row, rowAtIndex);
[cell updateCellWithId:rowAtIndex];
}
return cell;
}
2015-07-11 23:59:02.850 Colleen's EMA[8080:293895] viewWillAppear:
2015-07-11 23:59:02.851 Colleen's EMA[8080:293895] cancelAllOperations
2015-07-11 23:59:02.852 Colleen's EMA[8080:293895] tableView:numberOfRowsInSection: 1
2015-07-11 23:59:02.855 Colleen's EMA[8080:293895] tableView:cellForRowAtIndexPath:, tableView: <UITableView: 0x7f984d847a00; frame = (0 0; 320 568); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x7f984bd97e40>; layer = <CALayer: 0x7f984bf7dfc0>; contentOffset: {0, -108}; contentSize: {320, 148}>
2015-07-11 23:59:02.856 Colleen's EMA[8080:293895] [self.cachePointer objectAtIndex:0 = 65398
2015-07-11 23:59:02.856 Colleen's EMA[8080:293895] re-using cell at indexPath 0, pulling 65398
2015-07-11 23:59:02.856 Colleen's EMA[8080:293895] updateCellWithId: 65398
2015-07-11 23:59:02.856 Colleen's EMA[8080:293895] cancelAllOperations
2015-07-11 23:59:02.856 Colleen's EMA[8080:293895] startQueryWithId: 65398
2015-07-11 23:59:02.857 Colleen's EMA[8080:293895] initWithInvocation:andDelegate: <NSInvocation: 0x7f984f4773d0>
2015-07-11 23:59:02.857 Colleen's EMA[8080:294381] NLSTMQuery main
2015-07-11 23:59:02.857 Colleen's EMA[8080:293895] initWithInvocation:andDelegate: <NSInvocation: 0x7f984f562f00>
2015-07-11 23:59:02.857 Colleen's EMA[8080:294381] SQLAPI getTitleModelForSQL:
2015-07-11 23:59:02.864 Colleen's EMA[8080:294382] NLSJournalQuery main
2015-07-11 23:59:02.864 Colleen's EMA[8080:293895] startDescriptorQuery: 65398
2015-07-11 23:59:02.865 Colleen's EMA[8080:293895] initWithInvocation:andDelegate: <NSInvocation: 0x7f984eac6990>
2015-07-11 23:59:02.865 Colleen's EMA[8080:294530] NLSDescriptorArrayQuery main
2015-07-11 23:59:02.866 Colleen's EMA[8080:294530] getMeshDescriptorsForId:
2015-07-11 23:59:02.868 Colleen's EMA[8080:293895]
Здесь вы можете увидеть cellForRowAtIndexPath призыв к нижележащему Tableview ...
tableView:cellForRowAtIndexPath:, tableView: <UITableView: 0x7f984d825000; frame = (0 20; 320 1018); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7f984bd145b0>; layer = <CALayer: 0x7f984bf7d050>; contentOffset: {0, -64}; contentSize: {320, 20995512}>
2015-07-11 23:59:02.884 Colleen's EMA[8080:293895] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 4 beyond bounds [0 .. 0]'
*** First throw call stack