如何从UItableView获取节头

时间:2014-01-02 12:04:05

标签: ios objective-c 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];
}

6 个答案:

答案 0 :(得分:6)

相当古老的问题,但也许解决方案对其他人也有帮助......

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
});

答案 1 :(得分:2)

使用此委托方法访问标题视图:

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

答案 2 :(得分:1)

你实施了吗

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

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
你的ViewController子类中的

如果是,可能你在其中一种方法中遇到了一些问题。

答案 3 :(得分:0)

你在哪里打电话[tableView headerViewForSection:indexPath.section];

如果您在tableView可见之前在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中调用它,那么由于尚未设置tableView,您将获得nil。

如果您在加载tableView后再调用它,则应该返回UITableViewHeaderFooterView

答案 4 :(得分:0)

您的标题视图必须继承自UITableViewHeaderFooterView,否则此调用将无法正常工作,并且始终返回nil。

答案 5 :(得分:-1)

heightForRowAtIndexPath之前调用了{p> viewForHeaderInSection,所以你当然会得到nil