Как получить заголовок раздела из UItableView

Я пытаюсь получить заголовок заголовка раздела, используя этот код:

[tableView headerViewForSection:indexPath.section];

но этот код всегда возвращает мне ноль. Не могли бы вы привести несколько примеров, чтобы получить представление заголовка раздела из представления таблицы? Это моя реализация viewForHeader:

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

  DynamicHeader *headerView = [[DynamicHeader alloc] init];
        headerView.frame = CGRectMake(0, 0, 320, 40);
        UILabel *headerLbl = [[UILabel alloc] init];
        headerLbl.frame = CGRectMake(10, 10, 300, 20);
        if(((SectionViewController *)sharedInstance.currentViewController).currentSectionType == 25)
        {
            UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"minus.png"]];
            imgView.frame = CGRectMake(285, 14.5, 16, 13);
            [headerView addSubview:imgView];
            UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:sharedInstance action:@selector(headerTap:)];
            [headerView addGestureRecognizer:recognizer];
            headerView.tableView = tableView;
            headerView.heightForRows = 95;
            headerView.isOpen = YES;
        }
 headerLbl.text = [[[[[((SectionViewController *)sharedInstance.currentViewController).responseDictionary valueForKey:DATA_PARAMETER] valueForKey:SECTION_TABLE_PARAMETER] objectAtIndex:section] valueForKey:TABLE_SECTION_HEADER] capitalizedString];
 [headerView addSubview:headerLbl];

        return headerView;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

 if((DynamicHeader *)[tableView headerViewForSection:indexPath.section] != nil)
        {
            return ((DynamicHeader *)[tableView headerViewForSection:indexPath.section]).heightForRows;
        }
        else
        {
            return 95;
        }

}


- (void)headerTap: (UITapGestureRecognizer *)recognizer
{
    DynamicHeader *view = (DynamicHeader *)[recognizer view];
    if(view.isOpen)
    {
        view.heightForRows = 0;

    }
    else
    {
        view.heightForRows = 95;
    }
    view.isOpen = !view.isOpen;

    [view.tableView beginUpdates];
    [view.tableView endUpdates];
}

Ответ 1

Довольно старый вопрос, но, возможно, решение полезно и для других...

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

Если вид таблицы, заголовка или нижнего колонтитула не отображается в представлении таблицы, вызов " cellForRowAtIndexPath:", " headerViewForSection:" или " > footerViewForSection: 'может возвращать' nil. (См. UITableView.h для документирования этого поведения. Единственным исключением было бы то, что представление не использовало струйку в виде табличного представления)

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

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

Пример для представления заголовка:

CGRect  sectionHeaderRect = [self.tableView rectForHeaderInSection:groupSectionIndex];
[self.tableView scrollRectToVisible:sectionHeaderRect
                           animated:NO];

// Let the tableview load the needed views
dispatch_async(dispatch_get_main_queue(), ^{

    UITableViewHeaderFooterView*    groupSectionHeaderView = [self.tableView headerViewForSection:sectionIndex];

    // Use groupSectionHeaderView
});

Ответ 2

Используйте этот метод делегата для доступа к представлению заголовка:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section

Ответ 3

Вы реализовали

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

и

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;

в подклассе ViewController?

И если да, возможно, у вас есть какая-то проблема в одном из этих методов.

Ответ 4

Где вы звоните [tableView headerViewForSection:indexPath.section];?

Если вы вызываете его в - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath до того, как будет видна таблицаView, вы получите нуль, поскольку tableView еще не настроен.

Если вы называете это else, где после загрузки таблицыView вы должны вернуть UITableViewHeaderFooterView.

Ответ 5

heightForRowAtIndexPath вызывается до viewForHeaderInSection, поэтому, конечно, вы получите nil.