UITableView -headerViewForSection返回(null)
我有2个部分的UITableView
。 每个都有自己的headerView
。
我通过-viewForHeaderInSection:
方法创build了一个自定义的headerView
。
后来,我打算修改一下,所以我需要使用viewForHeader
方法,但我无法访问headerView
和它的子subViews
。
作为一个简单的例子,我试图在viewForHeader
中NSLog
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
方法。
其余的几乎和单元格一样。
先决条件:
- 将标题高度设置为40
- 将段数设置为2或更多
- 将每部分的行数设置为至less1
- 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
子类:
- 创build一个
UITableViewHeaderFooterView
子类并将其命名为CustomHeaderView
- 为该类创build一个View接口nib文件
- 在xib中,selectView&in的Identity Inspector
- 将Custom类指定为
CustomHeaderView
- 将Custom类指定为
- 制作属性,在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; }