Подтвердить что ты не робот

Uifyview headerViewForSection: всегда возвращает nil

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

Я могу видеть заголовки, если я печатаю значение [tableview subviews], но я не знаю, почему метод ничего не вернет.

То, что я пытаюсь сделать, - это получить файл ActivityIndicator, который находится в headerview, и запустить его или остановить его с помощью вызова метода.

Заголовки всегда окрашены в порядке, но я не могу получить ссылку на нее. Кроме того, вызов headerViewForSection: не вызывает метод делегата, это нормально?

footerViewForSection: имеет ту же проблему

Некоторые коды:

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"iPadTableCells" owner:nil options:nil];
    UIView* header = [objs objectAtIndex: 0];

    UIActivityIndicatorView* activityIndicator = (UIActivityIndicatorView*) [header viewWithTag:5];
    [activityIndicator startAnimating]

    return header;

}

из любого метода:

    UIView* headerView = [tableview headerViewForSection: section];  //returns nil

    if (headerView) {
        UIActivityIndicatorView* activityIndicator = (UIActivityIndicatorView*)[headerView viewWithTag: 5];
        [activityIndicator stopAnimating];
    }
4b9b3361

Ответ 1

Ответ

Из документов:

Чтобы представление таблицы было известно о вашем представлении заголовка или нижнего колонтитула, вам нужно зарегистрировать его. Вы делаете это, используя registerNib:forCellReuseIdentifier: или registerClass:forCellReuseIdentifier: метода UITableView.

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

... если вы хотите использовать метод headerViewForSection.

Альтернативный ответ

В качестве альтернативы вы можете проверить, следует ли продолжать вращаться внутри viewForHeaderInSection method, а затем отправлять только вызов:

[self.tableView beginUpdates];
[self.tableView endUpdates];

Чтобы обновить заголовок раздела.

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

Ответ 2

Прошло некоторое время с тех пор, как был задан этот вопрос, и недавно я столкнулся с подобной проблемой и задал свой собственный вопрос: UITableView -headerViewForSection возвращает (null) < ш > Я считаю, что у меня есть ответ.


Предварительные шаги:

  • Создайте подкласс UITableViewHeaderFooterView и назовите его CustomHeaderView
  • Создайте файл интерфейса интерфейса представления для класса (видимо, вы назвали его iPadTableCells здесь)
  • В xib выберите View и в нем Identity Inspector
    • Укажите Пользовательский класс как CustomHeaderView
  • Сделать свойство, синтезировать и подключать его к xib
    • @property (strong, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

Используйте следующий код:

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    static NSString *HeaderIdentifier = @"header";
    CustomHeaderView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:HeaderIdentifier];

    if(!header) {
        NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"iPadTableCells"
                                                      owner:nil
                                                    options:nil];
        header = [objs objectAtIndex: 0];
    }

    [header.activityIndicator startAnimating];
    return header;
}

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

CustomHeaderView *headerView = (CustomHeaderView*)[tableView headerViewForSection:section];
[headerView.activityIndicator stopAnimating];

Ответ 3

В быстрой

Все, что вам нужно, это создать экземпляр UITableViewHeaderFooterView для заголовка, который вам нужно вернуть

 func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let sectionHeaderView = UITableViewHeaderFooterView()
        //customize your view here
        return sectionHeaderView
    }