gpt4 book ai didi

ios - UITableView -headerViewForSection 返回(空)

转载 作者:技术小花猫 更新时间:2023-10-29 11:10:44 26 4
gpt4 key购买 nike

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

作为一个简单的例子,我正在尝试 NSLog -didSelectRowAtIndexPath: 中的 viewForHeader 对象,但我得到了一个 (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)
}

我是否需要创建自定义 UIView xib 作为 headerView? (因为根据 similar question 和文档”)

To make the table view aware of your header or footer view, you need to register it.
You do this using the registerNib:forCellReuseIdentifier: or
registerClass:forCellReuseIdentifier: method of UITableView.

最佳答案

方法一:

好吧,经过反复试验,我终于解决了自己的困境。
我像处理单元格一样处理 headerView

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

其余部分与细胞的概念几乎相同。

先决条件:

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

第一种方法:

-viewForHeaderInSection: 方法中创建和使用默认的 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. 创建了一个 UITableViewHeaderFooterView 子类并将其命名为 CustomHeaderView
  2. 为类(class)创建了一个View界面nib文件
  3. 在 xib 中,选择 View 并在它的 Identity Inspector
    • 自定义类指定为CustomHeaderView
  4. 制作属性,在 xib 中合成并连接它们
    • @property (strong, nonatomic) IBOutlet UILabel *lblSomething;
    • @property (strong, nonatomic) IBOutlet UIButton *btnSomething;

-viewForHeaderInSection: & -didSelectRowAtIndexPath: 修改为:

- (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+,如果出于任何原因,您的 header 是/必须是 UIView,请参阅下一个方法


方法二:

使用简单的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:我知道这段代码没有任何用处,但这只是其他人的示例。

关于ios - UITableView -headerViewForSection 返回(空),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20188049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com