正しいデリゲートとデータソースのリンクを使用してテーブルビューを設定しました。reloadDataメソッドは、viewForHeaderInSection:
を除くデータソースとデリゲートメソッドを呼び出します。
どうしてこんなことに?
tableView:viewForHeaderInSection:
を使用するには、tableView:heightForHeaderInSection:
も実装する必要があります。これにより、ヘッダーの適切な非ゼロの高さが返されます。また、tableView:titleForHeaderInSection:
も実装しないようにしてください。どちらか一方のみを使用する必要があります(viewForHeader
またはtitleForHeader
)。
@rmaddyは2回ルールを誤っています:実際には、tableView:viewForHeaderInSection:
はnotでtableView:heightForHeaderInSection:
も実装する必要があります。また、titleForHeader
とviewForHeader
の両方を呼び出すこともできます。レコードに対してのみルールを正しく記述します。
ルールは、ヘッダーに何らかの高さを与えない限り、viewForHeader
は呼び出されないということです。これは、次の3つの方法の任意の組み合わせで実行できます。
tableView:heightForHeaderInSection:
を実装します。
テーブルのsectionHeaderHeight
を設定します。
titleForHeader
を呼び出します(ヘッダーにデフォルトの高さがなければ、何らかの方法でヘッダーにデフォルトの高さが与えられます)。
これらのいずれも実行しない場合、ヘッダーはなく、viewForHeader
は呼び出されません。これは、高さがないと、ランタイムがビューのサイズを変更する方法を知らないため、表示を要求する必要がないためです。
estimatedSectionHeaderHeight
およびsectionHeaderHeight
の値を指定すると、問題が修正されました。例:self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
Rmaddyの答えを離れて、Headerビューを非表示にしようとして、「tableView:heightForHeaderInSection」に0.0fを返し、tableView:viewForHeaderInSection
から高さ0のビューを返しました。
return 1.0f
からreturn 0.0f
からtableView:heightForHeaderInSection
に変更した後、デリゲートメソッドtableView:viewForHeaderInSection
が実際に呼び出されました。
「tableView:heightForHeaderInSection」を使用せずに、目的のエフェクトが機能することがわかりました。しかし、これは「tableView:heightForHeaderInSection」デリゲートメソッドの呼び出しに問題がある他の人にとっては便利かもしれません。
tableView:heightForHeaderInSection:
の実装がUITableViewAutomaticDimension
を返す場合、tableView:viewForHeaderInSection:
は呼び出されないことに注意してください。
UITableViewAutomaticDimension
は、デリゲートメソッドtableView:titleForHeaderInSection:
が設定された標準のUITableViewHeaderFooterView
が使用されることを前提としています。
UITableView.h
のコメントから:
tableView:heightForHeaderInSection:
またはtableView:heightForFooterInSection:
からこの値を返すと、タイトルがnilでない場合、tableView:titleForHeaderInSection:
またはtableView:titleForFooterInSection:
から返される値に適合する高さになります。
tableView:heightForHeaderInSection:
を実装し、ヘッダーの高さを> 0に設定する必要があります。
このデリゲートメソッドは、viewForHeaderInSection:
メソッドと連携します。
これがお役に立てば幸いです。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
iOS 7.1でヘッダーが表示されない問題がありましたが、8.1および8.4で明示的にテストした後のリリースで正常に動作しています。
まったく同じコードの場合、7.1はnotで、tableView:heightForHeaderInSection:
およびtableView:viewForHeaderInSection:
を含むセクションヘッダーデリゲートメソッドを呼び出していました。
実験の後、removingのviewDidLoad
のこの行が7.1でヘッダーを再表示し、テストした他のバージョンに影響を与えないことがわかりました。
// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;
…そのため、少なくとも7.1には何らかの競合があるようです。
私と同じ問題が発生しましたが、xCode 9から自動高さ計算を使用していたため、上記のように明示的な高さ値を指定できません。いくつかの実験の後、私は解決策を得たとして、このメソッドをオーバーライドする必要があります。
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
チェック済み両方のオプションがありますが
ストーリーボードからAppleが言っていますが、それでもこの奇妙なエラーが発生しました。
注意してください:このエラーはIOS-1バージョンではなくIOS-11バージョンでのみ表示されました。多分それはxCodeのバグでしょう。ありがとう
ここに私が見つけたものがあります(Swift 4)(別の質問の このコメント に感謝)
TitleForHeaderInSectionまたはviewForHeaderInSectionを使用したかどうか-テーブルビューがスクロールされ、新しいセルがロードされたときに呼び出されなかったのではなく、headerViewのtextLabelに対して行ったフォント選択はロード時に最初に表示されたものにのみ表示されました、およびテーブルがスクロールされたときではありません。
修正はwillDisplayHeaderViewでした:
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
if let header = view as? UITableViewHeaderFooterView {
header.textLabel?.font = UIFont(name: yourFont, size: 42)
}
}