再利用可能なヘッダー/フッター ビューの新しい iOS 6 機能を使用するには、2 つの手順が必要です。あなたは最初のステップだけをやっているようです。
最初のステップ: UITableViewHeaderFooterView のカスタム サブクラスを登録することにより、セクション ヘッダー ビューに使用するクラスをテーブル ビューに伝えます (M3CHeaderFooter は UITableViewHeaderFooterView のサブクラスであると仮定します)。
2 番目のステップ: 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 個の UIViews を与えることを意味します。
再利用可能なヘッダー/フッター ビューの新機能を使用して、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 が後述) とは対照的に、サブビューのインスタンスが 1 つだけ作成されるようになります。その後、カスタム サブビューにアクセスできるようにするプロパティをサブクラス内に追加できます。