2013-04-21 5 views
0

У меня есть элемент управления, который частично или полностью изменяет содержимое таблицыView. После того, как произошло изменение, я установил флаг tableViewContentHasChanged:Когда UITableView полностью перезагружен

BOOL tableViewContentHasChanged = YES; 
[self.tableView reloadData]; 
tableViewContentHasChanged = NO; 

Моя проблема появляется в tableView:viewForHeaderInSection:; он называется после, вид таблицы перезагружается, поэтому мой флаг не эффективен внутри этого метода.

Вкратце: как правильно смотреть, когда стол имеет полностью перезаряжен, так что я могу установить флаг на NO? И, что я, возможно, делаю неправильно?

+2

Можете ли вы объяснить цель этого флага? –

+0

. Целью является то, что мне нужно обновить некоторые данные в свойстве block для headerViews, когда изменяется содержимое (и, следовательно, индексы). Очевидно, я не хочу делать это все время, только когда происходит изменение. Это цель – user1244109

+0

Если бы я был вами, я бы проверял методы «beginUpdates» и «endUpdates» UITableView. Возможно, он более надежный, чем reloadData. –

ответ

2

Я думаю, что лучший способ справиться с этим в модели данных, как другие упомянутые, но если вам действительно нужно, чтобы сделать это, вы можете сделать следующее:

Согласно Apple's documentation, только видимые разделы/клетки перезагружается когда вы звоните reloadData

так что вы должны знать, когда последний видимый заголовок оказывается, таким образом вы установите:

tableViewContentHasChanged = YES; 
    [self.tableView reloadData]; 

Тогда в cellForRowAtIndexPath: получить последний отображаемый индекс и сохранить его в качестве члена переменный:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    //Your cell creating code here 
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"TryCell"]; 

    //Set last displayed index here 
    lastLoadedSectionIndex = indexPath.section; 
    NSLog(@"Loaded cell at %@",indexPath); 
    return cell; 
} 

Таким образом, когда viewForHeaderInSection: называется вы будете знать, что последний заголовок в этом перегрузочном событии:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ 
    //Create or customize your view 
    UIView *headerView = [UIView new]; 

    //Toggle tableViewContentHasChanged when it's the last index 
    if (tableViewContentHasChanged && section == lastLoadedSectionIndex) { 
    tableViewContentHasChanged = NO; 
    NSLog(@"Reload Ended"); 

    } 
    return headerView; 
} 

Пожалуйста, обратите внимание, что этот метод будет работать только тогда, когда последний видимый участок имеет в не более 1 строки.

Надеюсь, это поможет.

+0

Спасибо Мариам. Хотя я решил это уже так же, и пришел сюда, чтобы написать тот же ответ =). Принято как правильно – user1244109

Смежные вопросы