Первоначально видимые ячейки становятся невидимыми после вызова reloadSections: withRowAnimation: метод - PullRequest
10 голосов
/ 28 июня 2010

Я хочу отобразить таблицу, которая имеет несколько разделов, и изначально отображаются только 3 элемента разделов.Когда пользователь касается нижнего колонтитула раздела, нижний колонтитул раздела теряется (становится равным нулю), и все элементы этого раздела будут показаны пользователю.

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

-(void)loadMoreRowsInSection:(NSInteger)section {
    [groupStates replaceObjectAtIndex:section withObject:[NSNumber numberWithBool:YES]];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:NO];
}

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

-(UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    int count = [[(NSDictionary*)[filters objectAtIndex:section] valueForKeyPath:@"values.value"] count];
    if (count>3&&![[groupStates objectAtIndex:section] boolValue]) {
        LoadMoreFooter* loadMoreFooter = [[LoadMoreFooter alloc] initWithParent:self Section:section];
        return [loadMoreFooter view];
    }   
    else return nil;
}

Когда пользователь нажимает нижний колонтитул раздела и вызывается функция loadMoreRowsInSection, этот раздел перезагружается, но текущие строки этого раздела исчезают.Когда я прокручиваю вверх, заставляя строки выходить за пределы экрана, снова появляются строки.

Если я позвоню reloadData вместо reloadSections:withRowAnimation:, проблем не возникнет, но не представляется хорошей идеей перезагрузить всю таблицу.Плюс в reloadTable нет анимации.

Кто-нибудь сталкивался с этой проблемой?

Ответы [ 5 ]

24 голосов
/ 10 декабря 2013

Является ли это "статической" ячейкой в ​​том смысле, что вы сохраняете ссылку на нее самостоятельно? В этом случае проблема, вероятно, заключается в следующем:

Когда вы выполняете анимированную перезагрузку, табличное представление будет затухать в существующих ячейках, в то же время исчезая в новых ячейках. Проблема в том, что, когда «новая» ячейка точно такая же, как и старая, одна и та же ячейка будет одновременно появляться и исчезать! А в вашем случае анимация затухания имеет приоритет, и ячейка скрыта.

Вот несколько возможных решений:

  1. Вместо статических ячеек есть многократно используемый подкласс "ячейка-обертка" - ячейка, единственная цель которой - содержать упакованное представление. Затем вместо этого сохраните статические ссылки на представления и добавьте их в ячейку обернутой очереди в cellForRowAtIndexPath:

  2. Избегайте перезагрузки индексных путей статических ячеек - вместо этого сделайте [UIView transitionWithView:self.myStaticCell duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil]

6 голосов
/ 22 августа 2011

У меня тоже была эта проблема. Вместо этого я использовал UITableViewRowAnimationNone, который по какой-то причине все еще оживляет раздел (чего не делает reloadData), но он также отображает его правильно после анимации.

4 голосов
/ 05 сентября 2013

Добавление вызова к reloadData после вызова на reloadSections:withRowAnimation:, по-видимому, устраняет проблему исчезающей ячейки, не затрагивая анимацию.

1 голос
/ 25 февраля 2011

У меня была похожая проблема, когда заголовки разделов застревали, где бы они ни были. Хотя моя проблема сохраняется даже при прокрутке экрана вкл / выкл:

iphone app screenshot

Единственный способ, который я нашел, чтобы исправить это, это просто использовать reloadData вместо reloadSections:withRowAnimation:.

0 голосов
/ 15 июня 2016

Моя ошибка заключалась в следующем: у меня был TableView с несколькими разделами.Когда я выбрал раздел для расширения (и отображения ячеек), другие разделы выше были скрыты.

Я обрабатывал заголовок как ячейки.

Мое решение без reloadData():

внутри метода переопределения func viewDidLoad() Я использовал этот код:

tableTeams.registerNib(UINib(nibName: "header", bundle: nil ), 
forCellReuseIdentifier: "HeaderCell")

Но я должен был использовать это:

tableTeams.registerNib(UINib(nibName: "header", bundle: nil),
forHeaderFooterViewReuseIdentifier: "HeaderCell")

и внутри func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?, я бы использовал этокод:

func tableView(tableView: UITableView, viewForHeaderInSection section:
Int) -> UIView? {
      let cell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("HeaderCell")
as! CustomHeaderUiView

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

...