Принятый метод кажется грязным, он просто создает кучу новых ячеек, которые хранятся вместе с плохими. Вот несколько решений в зависимости от вашей ситуации:
1.
Во-первых, для ситуации, описанной в вопросе, вы не должны сбрасывать свои ячейки и создавать новые представления для каждого цикла. Вам нужно пометить свой вид, а затем получить его обратно из ячейки, когда вы получите ячейку повторного использования:
- (UITableViewCell*) tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath {
UITableViewCell *cell = [tableView dequeueResuableCellWithIdentifier:SOME_ID];
if(!cell) {
cell = [[UITableViewCell alloc] init];
UIView *myView = [[UIView alloc] init];
cell.backgroundView = myView;
[myView setTag:5]; //<------
}
UIView *myView = [cell viewWithTag:5]; //<------
if ((indexPath.row % 2) == 0)
myView.backgroundColor = [UIColor greenColor];
else
myView.backgroundColor = [UIColor whiteColor];
return cell;
}
//then just reload the tableview.
2.
... или, что еще лучше, почему бы просто не использовать цвет фона ячейки и не обновлять его, не создавая представление.
3.
Верный способ действительно очистить старые кэшированные ячейки, просто воссоздать объект UITableView.
4.
В большинстве случаев вам не нужно уничтожать эти ячейки, просто следите за вашими элементами и обновляйте их после получения многократно используемой ячейки. Вы можете пометить все свои элементы, сохранить ссылку на них массива, найти их с учетом иерархии представления ... Im конечно, есть множество других способов.
5.
Вот один вкладыш для прямой очистки всех ячеек, хотя не рекомендуется возиться с внутренностями таких объектов, как они могут измениться в будущих версиях:
[(NSMutableDictionary*)[tableview valueForKey:@"_reusableTableCells" ] removeAllObjects];