UITableView reloadSections / reloadData: представление заголовка становится пустым - PullRequest
23 голосов
/ 28 декабря 2011

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

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

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

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

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

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

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

[self.tableView reloadData]

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

Причина, по которой я использую

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

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

Упаковка с beginUpdates / endupdates не работает.

Ответы [ 5 ]

44 голосов
/ 21 января 2015

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

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

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

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

1 голос
/ 07 апреля 2017

В Свифт:

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

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

1 голос
/ 29 декабря 2011

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

выглядит так:

    for (Element *eleSection in self.gruppenKoepfe) {
        if ( eleSection.type.integerValue == qmObjectTypeFormularSpalte || eleSection.type.integerValue == qmObjectTypeFormularZeile ) {
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:nCount] withRowAnimation:UITableViewRowAnimationFade];
        }
        nCount ++;
    }     
0 голосов
/ 12 августа 2016

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

0 голосов
/ 07 июня 2013

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

Например, свойство и экземпляр

@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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...