UITableView reloadSections/reloadData: заголовок выглядит пустым

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

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom];

Все работает так, как ожидалось, кроме одного: вид заголовка раздела становится белым. Когда я просматриваю таблицу, заголовок снова становится нормальным.

Итак, я думаю, что есть какая-то проблема с рисунком таблицы.

Самое смешное, если я использую UITableViewRowAnimationFade вместо этого, тогда даже когда я просматриваю таблицу, заголовок по-прежнему остается белым.

Когда я обновляю только один раздел, также нет проблем - при обновлении более одного раздела возникает проблема.

Если я использую

[self.tableView reloadData]

тогда все работает нормально.

Я использую

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom];

- это потому, что я хочу анимацию.

Обертка с beginUpdates/endupdates не работает.

Ответ 1

Я нашел работу вокруг - не очень элегантный, но он работает. Вместо того, чтобы предоставлять NSIndexSet несколько разделов, я вызываю reloadSections внутри цикла for-loop только с одним разделом в каждом вызове.

выглядит следующим образом:

    for (Element *eleSection in self.gruppenKoepfe) {
        if ( eleSection.type.integerValue == qmObjectTypeFormularSpalte || eleSection.type.integerValue == qmObjectTypeFormularZeile ) {
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:nCount] withRowAnimation:UITableViewRowAnimationFade];
        }
        nCount ++;
    }     

Ответ 2

Я понимаю, что это долгое время с момента возникновения этого вопроса, но я думаю, что все приведенные ниже ответы неверны.

У меня была такая же проблема (с кодом другого пользователя), и я должен был обмануть этот пост, когда понял, что код неправильно повторяет использование заголовка таблицы. Исчезновение заголовка состояло в том, что код содержал только UIView, а не UITableViewHeaderFooterView, правильно зарегистрированный и настроенный для повторного использования.

Посмотрите на ответ здесь: Как использовать UITableViewHeaderFooterView?

Мои пустые заголовки ушли, когда я создал многоразовый заголовок.

Ответ 3

В Swift:

Вам нужно создать класс подкласса UITableViewHeaderFooterView и зарегистрировать его в виде таблицы. Затем в viewForHeaderInSection вы выполняете let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! YourHeaderView, аналогично тому, что вы делаете для UITableViewCells. Затем верните это значение header.

Обманчивая вещь - это функция, вызывающая возврат UIView?, когда она действительно нуждается в dequeuedReusableHeaderFooterView или reloadData приведет к ее исчезновению

Ответ 4

У меня была аналогичная проблема, за исключением того, что я пытался удалить/вставить разделы, и я обнаружил, что сохранение сильного свойства, указывающего на весь заголовок (т.е. не только подвью), остановило его исчезновение во время обновлений раздела.

например. Свойство и экземпляр

@property (nonatomic, strong) UIView *headerView;

-(UIView *)headerView {
  if ( !_headerView ) {
    _headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.bounds.size.width, 300)];
    // add additional view setup, including subviews
  }
  return _headerView;
}

И в tableView:(UITableView *)viewForHeaderInSection:(NSInteger)section:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if ( section == theCorrectSection ) {
        return self.headerView;
    }
    return nil;
}

Ответ 5

У меня была одна и та же проблема, и это не было из вышеперечисленного. Моя проблема заключалась в том, что я скрывал первый заголовок, и по какой-то причине после более чем 10 перезагрузок заголовок в индексе 2 был скрыт. Когда я устанавливаю headerView.hidden = false, все в порядке.