web-dev-qa-db-ja.com

UITableView:viewForHeaderInSection:reloadData中に呼び出されません:

正しいデリゲートとデータソースのリンクを使用してテーブルビューを設定しました。reloadDataメソッドは、viewForHeaderInSection:を除くデータソースとデリゲートメソッドを呼び出します。

どうしてこんなことに?

118
inforeqd

tableView:viewForHeaderInSection:を使用するには、tableView:heightForHeaderInSection:も実装する必要があります。これにより、ヘッダーの適切な非ゼロの高さが返されます。また、tableView:titleForHeaderInSection:も実装しないようにしてください。どちらか一方のみを使用する必要があります(viewForHeaderまたはtitleForHeader)。

244
rmaddy

@rmaddyは2回ルールを誤っています:実際には、tableView:viewForHeaderInSection:nottableView:heightForHeaderInSection:も実装する必要があります。また、titleForHeaderviewForHeaderの両方を呼び出すこともできます。レコードに対してのみルールを正しく記述します。

ルールは、ヘッダーに何らかの高さを与えない限り、viewForHeaderは呼び出されないということです。これは、次の3つの方法の任意の組み合わせで実行できます。

  • tableView:heightForHeaderInSection:を実装します。

  • テーブルのsectionHeaderHeightを設定します。

  • titleForHeaderを呼び出します(ヘッダーにデフォルトの高さがなければ、何らかの方法でヘッダーにデフォルトの高さが与えられます)。

これらのいずれも実行しない場合、ヘッダーはなく、viewForHeaderは呼び出されません。これは、高さがないと、ランタイムがビューのサイズを変更する方法を知らないため、表示を要求する必要がないためです。

26
matt

estimatedSectionHeaderHeightおよびsectionHeaderHeightの値を指定すると、問題が修正されました。例:self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

19
Sharukh Mastan

Rmaddyの答えを離れて、Headerビューを非表示にしようとして、「tableView:heightForHeaderInSection」に0.0fを返し、tableView:viewForHeaderInSectionから高さ0のビューを返しました。

return 1.0fからreturn 0.0fからtableView:heightForHeaderInSectionに変更した後、デリゲートメソッドtableView:viewForHeaderInSectionが実際に呼び出されました。

「tableView:heightForHeaderInSection」を使用せずに、目的のエフェクトが機能することがわかりました。しかし、これは「tableView:heightForHeaderInSection」デリゲートメソッドの呼び出しに問題がある他の人にとっては便利かもしれません。

7
rrrrrraul

tableView:heightForHeaderInSection:の実装がUITableViewAutomaticDimensionを返す場合、tableView:viewForHeaderInSection:は呼び出されないことに注意してください。

UITableViewAutomaticDimensionは、デリゲートメソッドtableView:titleForHeaderInSection:が設定された標準のUITableViewHeaderFooterViewが使用されることを前提としています。

UITableView.hのコメントから:

tableView:heightForHeaderInSection:またはtableView:heightForFooterInSection:からこの値を返すと、タイトルがnilでない場合、tableView:titleForHeaderInSection:またはtableView:titleForFooterInSection:から返される値に適合する高さになります。

5
Benjohn

tableView:heightForHeaderInSection:を実装し、ヘッダーの高さを> 0に設定する必要があります。

このデリゲートメソッドは、viewForHeaderInSection:メソッドと連携します。

これがお役に立てば幸いです。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
         return 40;
}
5
Chiara

iOS 7.1でヘッダーが表示されない問題がありましたが、8.1および8.4で明示的にテストした後のリリースで正常に動作しています。

まったく同じコードの場合、7.1はnotで、tableView:heightForHeaderInSection:およびtableView:viewForHeaderInSection:を含むセクションヘッダーデリゲートメソッドを呼び出していました。

実験の後、removingviewDidLoadのこの行が7.1でヘッダーを再表示し、テストした他のバージョンに影響を与えないことがわかりました。

// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;

…そのため、少なくとも7.1には何らかの競合があるようです。

3
Benjohn

私と同じ問題が発生しましたが、xCode 9から自動高さ計算を使用していたため、上記のように明示的な高さ値を指定できません。いくつかの実験の後、私は解決策を得たとして、このメソッドをオーバーライドする必要があります。

-(CGFloat)tableView:(UITableView *)tableView 
         estimatedHeightForHeaderInSection:(NSInteger)section
{
      return 44.0f;
}

チェック済み両方のオプションがありますが

  1. 自動高さ計算
  2. 自動推定高度計算

ストーリーボードからAppleが言っていますが、それでもこの奇妙なエラーが発生しました。

注意してください:このエラーはIOS-1バージョンではなくIOS-11バージョンでのみ表示されました。多分それはxCodeのバグでしょう。ありがとう

2
Najam

ここに私が見つけたものがあります(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)
    }
}
0
RanLearns