使用可重用页眉/页脚视图的新 iOS 6 功能涉及两个步骤。你似乎只做了第一步。
第一步:您通过注册 UITableViewHeaderFooterView 的自定义子类(我假设您的 M3CHeaderFooter 是 UITableViewHeaderFooterView 的子类)来告诉表格视图要为节标题视图使用什么类。
第二步:通过实现 tableView 委托方法,告诉表视图对标题部分使用(和重用)什么视图
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
所以在你的 viewDidLoad 你会实现这样的东西:
// ****** Do Step One ******
[_tableView registerClass:[M3CHeaderFooter class] forHeaderFooterViewReuseIdentifier:@"TableViewSectionHeaderViewIdentifier"];
然后,您将在创建和显示表视图的类中实现表视图委托方法:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 40.0;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
static NSString *headerReuseIdentifier = @"TableViewSectionHeaderViewIdentifier";
// ****** Do Step Two *********
M3CHeaderFooter *sectionHeaderView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:headerReuseIdentifier];
// Display specific header title
sectionHeaderView.textLabel.text = @"specific title";
return sectionHeaderView;
}
现在请注意,您不需要子类 UITableViewHeaderFooterView 来使用它。在 iOS 6 之前,如果你想要一个部分的标题视图,你需要实现上面的 tableView 委托方法并告诉表视图每个部分使用什么视图。因此,每个部分都有您提供的 UIView 的不同实例。这意味着如果您的 tableView 有 100 个部分,并且在委托方法中您创建了一个 UIView 的新实例,那么您将为显示的 100 个部分标题为 tableView 提供 100 个 UIView。
使用可重用页眉/页脚视图的新功能,您可以创建 UITableViewHeaderFooterView 的实例,系统会为每个显示的节标题重用它。
如果您想拥有一个可重用的 UITableViewHeaderFooterView 而无需子类化,那么您只需将 viewDidLoad 更改为:
// Register the class for a header view reuse.
[_buttomTableView registerClass:[UITableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"TableViewSectionHeaderViewIdentifier"];
然后你的委托方法:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 40.0;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
static NSString *headerReuseIdentifier = @"TableViewSectionHeaderViewIdentifier";
// Reuse the instance that was created in viewDidLoad, or make a new one if not enough.
UITableViewHeaderFooterView *sectionHeaderView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:headerReuseIdentifier];
sectionHeaderView.textLabel.text = @"Non subclassed header";
return sectionHeaderView;
}
我希望这已经足够清楚了。
编辑: 子类化标题视图时,如果您希望向 headerView 添加自定义视图,则可以实现类似于以下的代码:
// Add any optional custom views of your own
UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 30.0)];
[customView setBackgroundColor:[UIColor blueColor]];
[sectionHeaderView.contentView addSubview:customView];
在子类中执行此操作,而不是 viewForHeaderInSection: 委托方法(如下面的 Matthias 所述),将确保仅创建任何子视图的一个实例。然后,您可以在子类中添加任何允许您访问自定义子视图的属性。