UITableView -headerViewForSection返回(null)

我有2个部分的UITableView 。 每个都有自己的headerView
我通过-viewForHeaderInSection:方法创build了一个自定义的headerView
后来,我打算修改一下,所以我需要使用viewForHeader方法,但我无法访问headerView和它的子subViews

作为一个简单的例子,我试图在viewForHeaderNSLog viewForHeader对象-didSelectRowAtIndexPath:但是我得到一个(null)结果。

示例代码:

 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 75; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *myHeader = [[UIView alloc] init]; switch (section) { case 0: [myHeader setBackgroundColor:[UIColor greenColor]]; break; case 1: [myHeader setBackgroundColor:[UIColor redColor]]; break; default: break; } UILabel *myLabel = [[UILabel alloc] init]; [myLabel setFrame:CGRectMake(10, 0, 100, 30)]; [myLabel setTag:101]; [myLabel setBackgroundColor:[UIColor clearColor]]; [myLabel setText:[NSString stringWithFormat:@"Section: %d",section]]; [myHeader addSubview:myLabel]; return myHeader; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewHeaderFooterView *testView = [self.tableView headerViewForSection:indexPath.section]; NSLog(@"%@",testView); //displays (null) } 

我需要创build自定义的UIView xib作为headerView吗? ( 因为按照类似的问题和文档 “)

要使表视图知道您的页眉或页脚视图,您需要注册它。
你可以使用registerNib:forCellReuseIdentifier:或
registerClass:forCellReuseIdentifier:UITableView的方法。

方法1:

好吧,经过一番反复试验,我终于解决了自己的困境。
我做了headerView就像我会做一个单元格。

对于一个单元格,我们将使用UITableViewCell并使用dequeueReusableCellWithIdentifier
而…
对于页眉/页脚,我们将使用UITableViewHeaderFooterView并使用dequeueReusableHeaderFooterViewWithIdentifier方法。

其余的几乎和单元格一样。

先决条件:

  1. 将标题高度设置为40
  2. 将段数设置为2或更多
  3. 将每部分的行数设置为至less1
  4. iOS6 +( UITableViewHeaderFooterView将不适用于iOS5及以下版本

第一种方法:

-viewForHeaderInSection:方法中创build和使用默认的UITableViewHeaderFooterView

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { static NSString *HeaderIdentifier = @"header"; UITableViewHeaderFooterView *myHeader = [tableView dequeueReusableHeaderFooterViewWithIdentifier:HeaderIdentifier]; if(!myHeader) { myHeader = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:HeaderIdentifier]; } UIButton *btnUp = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [btnUp setTag:101]; [btnUp setTitle:@"-" forState:UIControlStateNormal]; [btnUp setFrame:CGRectMake(tableView.frame.size.width - 35, 5, 30, 30)]; [myHeader addSubview:btnUp]; [myHeader.textLabel setText:[NSString stringWithFormat:@"Section: %d",section]]; [myHeader setFrame:CGRectMake(0, 0, tableView.frame.size.width, 50)]; return myHeader; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewHeaderFooterView *theHeaderView = [tableView headerViewForSection:indexPath.section]; NSLog(@"%@",theHeaderView); // -- great! ... not (null) anymore UIButton *theButton = (UIButton *)[theHeaderView viewWithTag:101]; [theButton setTitle:@"+" forState:UIControlStateNormal]; } 

第二种方法:

使用自定义的UITableViewHeaderFooterView子类:

  1. 创build一个UITableViewHeaderFooterView子类并将其命名为CustomHeaderView
  2. 为该类创build一个View接口nib文件
  3. 在xib中,selectView&in的Identity Inspector
    • Custom类指定为CustomHeaderView
  4. 制作属性,在xib中合成并连接它们
    • @property (strong, nonatomic) IBOutlet UILabel *lblSomething;
    • @property (strong, nonatomic) IBOutlet UIButton *btnSomething;

修改了-viewForHeaderInSection: &- -didSelectRowAtIndexPath: as:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { static NSString *HeaderIdentifier = @"header"; CustomHeaderView *myHeader = [tableView dequeueReusableHeaderFooterViewWithIdentifier:HeaderIdentifier]; if(!myHeader) { // [tableView registerClass:[CustomHeaderView class] forHeaderFooterViewReuseIdentifier:HeaderIdentifier]; myHeader = [[[NSBundle mainBundle] loadNibNamed:@"CustomHeaderView" owner:self options:nil] objectAtIndex:0]; } [myHeader.btnSomething setTitle:@"-" forState:UIControlStateNormal]; [myHeader.lblSomething setText:[NSString stringWithFormat:@"Section: %d",section]]; return myHeader; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { CustomHeaderView *theHeaderView = (CustomHeaderView*)[tableView headerViewForSection:indexPath.section]; NSLog(@"%@",theHeaderView); [theHeaderView.lblSomething setAlpha:theHeaderView.lblSomething.alpha-0.1]; [theHeaderView.btnSomething setTitle:@"+" forState:UIControlStateNormal]; } 

PS:与UITableViewHeaderFooterView的问题是,它只是iOS6 +,如果,由于某种原因,你的头是/必须是一个UIView ,然后看下一个方法


方法2:

使用一个简单的UIView

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *vwHeader = [[UIView alloc] init]; [vwHeader setTag:200 + section]; //[1] first method switch (section) { case 0: [vwHeader setBackgroundColor:[UIColor greenColor]]; break; case 1: [vwHeader setBackgroundColor:[UIColor redColor]]; break; default: break; } UILabel *lblTitle = [[UILabel alloc] init]; [lblTitle setFrame:CGRectMake(10, 0, 100, 30)]; [lblTitle setTag:100 + section]; //[2] alternative method [lblTitle setBackgroundColor:[UIColor clearColor]]; [lblTitle setText:[NSString stringWithFormat:@"Section: %d",section]]; [vwHeader addSubview:lblTitle]; return vwHeader; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIView *vwTest = [self.tableView viewWithTag:200 + indexPath.section]; //[1] NSLog(@"[1] : %@",vwTest); //or UILabel *lblTest = (UILabel *)[self.tableView viewWithTag:100 + indexPath.section]; //[2] NSLog(@"%@",lblTest.text); UIView *vwTestForSuperview = lblTest.superview; NSLog(@"[2] : %@",vwTestForSuperview); } 

PS:我知道这个代码没有任何伟大的目的,但这只是其他人的一个例子。

我认为你的问题可以很容易地解决:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UITableViewHeaderFooterView *myHeader = [[UITableViewHeaderFooterView alloc] init]; switch (section) { case 0: [myHeader setBackgroundColor:[UIColor greenColor]]; break; case 1: [myHeader setBackgroundColor:[UIColor redColor]]; break; default: break; } UILabel *myLabel = [[UILabel alloc] init]; [myLabel setFrame:CGRectMake(10, 0, 100, 30)]; [myLabel setTag:101]; [myLabel setBackgroundColor:[UIColor clearColor]]; [myLabel setText:[NSString stringWithFormat:@"Section: %d",section]]; [myHeader addSubview:myLabel]; return myHeader; 

}

基本上,您需要使用UITableViewHeaderFooterView类从viewForHeaderInSectioncallback返回。 之后,在你的表视图上调用headerViewForSection将返回对象的有效实例,而不是零。

你需要设置框架。

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *myHeader = [[UIView alloc] init]; myHeader.frame = CGRectMake(0, 0, 100, 75); //ADD THIS AND SET YOUR FRAME switch (section) { case 0: [myHeader setBackgroundColor:[UIColor greenColor]]; break; case 1: [myHeader setBackgroundColor:[UIColor redColor]]; break; default: break; } UILabel *myLabel = [[UILabel alloc] init]; [myLabel setFrame:CGRectMake(10, 0, 100, 30)]; [myLabel setTag:101]; [myLabel setBackgroundColor:[UIColor clearColor]]; [myLabel setText:[NSString stringWithFormat:@"Section: %d",section]]; [myHeader addSubview:myLabel]; return myHeader; }