2015-07-12 3 views
0

У меня есть два источника данных для моего 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 

ответ

0

Вы, кажется, предположить, что objectAtIndex: возвращает NIL, если индекс выходит за пределы:

if (![self.cachePointer objectAtIndex:indexPath.row]) 
{ 
    // index out of bounds, in fact this will never run 
} 

На самом деле, это не будет возвращать нуль, вместо этого возникает исключение, если индекс выходит за пределы. Правильный способ проверки:

if (indexPath.row >= self.cachePointer.count) 
{ 
    // index out of bounds 
} 
Смежные вопросы