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


127

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

どうしてこんなことに?


30
されるheightForHeaderInSection:実装しますか?
2013

TableViewの値を設定しましたsectionHeaderHeightか?
カーターメドリン16

回答:


256

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


3
メソッドのシグネチャにタイプミスがないことを確認してください。1つの間違った文字は、それが呼び出されないことを意味します。ケースも確認してください。また、から0が返されることを確認してくださいnumberOfSections
rmaddy 2013

すべてが正しく、正しくコンパイルされます..理解したい問題は、メソッドが呼び出されるタイミングの前後です.. tableView:viewForHeaderInSectionは、テーブルが表示されようとしているときに呼び出され、同期の実行の一部としてではありません[ tableview reloadData]
inforeqd

@maddy OMGありがとう、私は自分のインスタンスを作成しましたが、配列に追加しなかったのでとても愚かです
Happiehappie

4
あなたは絶対に両方を持つことができます。viewForHeaderInSection:titleForHeaderInSectionよりも優先されます。唯一の要件は、それ以外のviewForHeaderInSection、あなたは0よりも別の何かを使用して、テーブルビューにestimatedSectionHeaderHeightを設定することです:と呼ばれることはありません飽きないだろう
romrom

@romromのコメントへの追加:との両方titleForHeaderInSection:を実装 viewForHeaderInSection:し、後者から返されるビューがのサブクラスであるUITableViewHeaderFooterView場合textLabel.textは、自動的にtitleForHeaderInSection:文字列のすべて大文字バージョンに設定されます。この動作を防ぐtitleForHeaderInSection:には、継承しないでカスタムラベルを実装または使用しないでくださいtextLabel
Ortwin Gentz

40

トリックは、これら2つの方法が異なるに属していることであるUITableViewプロトコル:tableView:titleForHeaderInSection:あるUITableViewDataSourceプロトコル方法、tableView:viewForHeaderInSectionに属しますUITableViewDelegate

つまり:

  • メソッドを実装し、自分自身をのとしてのみ割り当て dataSourceUITableView場合、 tableView:viewForHeaderInSection実装は無視されます。

  • tableView:viewForHeaderInSection優先度が高くなります。あなたがメソッドの両方を実装し、両方として自分を割り当てた場合 dataSourcedelegateについてUITableView、あなたはセクションヘッダーのビューを返しますが、あなたは tableView:titleForHeaderInSection:無視されます。

私も削除してみましたtableView:heightForHeaderInSection:。それは問題なく動作し、上記の手順に影響を与えていないようでした。しかし、ドキュメントには、がtableView:viewForHeaderInSection正しく機能するために必要であると記載されています。安全のため、これも実装するのが賢明です。


6
あなたは私の日を作りました!!! 割り当てることをお忘れUITableViewDelegateself私は、と思ったので、tableView:viewForHeaderInSectionあるUITableViewDataSource方法。ありがとうございました!
denis631

1
「tableView:viewForHeaderInSection」は重要ではありません。重要なのは、どういうわけか高さを返すことです。1.推定または2.ハードコードされた値または3. titleForHeader固有のサイズを持つaのいずれかによって、それを達成できます。固有のサイズは、フォントファミリとサイズに基づいて計算されます。
ハニー

28

現実には、:@rmaddyは二回、ルールを虚偽表示しているtableView:viewForHeaderInSection:ではないあなたも実装することを必要とtableView:heightForHeaderInSection:し、また、それは両方を呼び出すために完全に罰金ですtitleForHeaderviewForHeader。私は記録のためだけにルールを正しく述べます:

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

  • 実装しtableView:heightForHeaderInSection:ます。

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

  • 呼び出しtitleForHeader(これにより、ヘッダーがない場合は、ヘッダーにデフォルトの高さが設定されます)。

これらのことを何も行わない場合、ヘッダーviewForHeaderはなく、呼び出されません。これは、高さがなければ、ランタイムはビューのサイズを変更する方法を認識できないため、高さを要求する必要がないからです。


のドキュメントからtableView:viewForHeaderInSection::「このメソッドtableView:heightForHeaderInSection:は、も実装されている場合にのみ正しく機能します。」
rmaddy 2014年

1
いいね。ドキュメントが言うこと、彼らは言う。実験してみましょう。事実は私が述べたとおりです。
2014年

そして、どのように、あなたは両方を持つことができますtitleForHeaderInSectionし、viewForHeaderInSection?テーブルビューは、2つのうちの1つだけを呼び出します(現時点ではどちらが優先されるかを忘れます)。
rmaddy 2014年

1
実際、パズルのピースがもう1つあります。これは、高さを割り当てる3つの方法のいずれかを使用せずに呼び出される場合 viewForHeaderがあります。私はこれを経験しましたが、私が呼び出されてヘッダーがうまく表示されたところ、ある日まで、私の側に変更はありませんでした。それが呼び出されるための最小要件が何であるかを発見するために実験を始めたときです。そして今、私は知っています。そして今、あなたもそうです。viewForHeaderviewForHeader
マット

2
@texasいいえ、xamarinは使用しません。Cocoaフレームワークの上に別のレベルの間接参照を追加すると、頭が爆発するだけです。:)
マット

20

与えるestimatedSectionHeaderHeightsectionHeaderHeight値は私の問題を修正しました。例えば、 self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension


私の問題はSwift 3.1にアップグレードした後に始まりました。このソリューションはそれを修正しました。
zevij

@pbuchheitアップルドキュメントはそれがiOSの7.0以降から利用可能であると言い、こちらをご覧くださいdeveloper.apple.com/documentation/uikit/uitableview/...
Sharukh Mastan

@Sharukh Mastanあなたは正しいようです。なんらかの理由で、そのプロパティを使用しようとすると警告が表示されていましたが、クリーンビルドを行った後に消えていました。
pbuchheit 2017

7

rmaddyの答えから離れて、ヘッダービューを非表示にしようとしていて、「tableView:heightForHeaderInSection」に対して0.0fを返し、から高さ0のビューを返していましたtableView:viewForHeaderInSection

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

「tableView:heightForHeaderInSection」を使用しなくても、目的の効果が機能することがわかります。しかし、これは「tableView:heightForHeaderInSection」デリゲートメソッドが呼び出されて問題が発生している他のユーザーに役立つ場合があります。


5

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

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

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

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

あなたの答えが実際に機能することをテストしましたか?注意深く読むと、最初にviewForHeaderInSectionが呼び出されることが明記されています。テーブルがリロードされたときにのみ呼び出されるわけではありません!
Karlis

5

それはあなたの実装ならばことは注目に値します簡単にtableView:heightForHeaderInSection:戻りUITableViewAutomaticDimension、その後、tableView:viewForHeaderInSection:呼び出されません。

UITableViewAutomaticDimensionUITableViewHeaderFooterView、デリゲートメソッドが入力された標準が使用されることを前提としていtableView:titleForHeaderInSection:ます。

のコメントからUITableView.h

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


1
estimatedSectionHeaderHeight何らかの値に設定した場合、tableView:viewForHeaderInSection呼び出されます(行の自動ディメンションの機能と同様に)
GreatWiz

興味深い、ありがとう。7.1では、この推定された高さの微妙さがセルにとって重要であったため、ヘッダーにも当てはまる可能性がありましたが、現在はそれほど重要ではありません。
ベンジョン2016

3

iOS 7.1ではヘッダーが表示されない問題がありましたが、8.1と8.4で明示的にテストした後のリリースで問題なく動作しました。

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

実験の結果、作成したヘッダーからこの行を削除viewDidLoadしても7.1では再び表示され、テストした他のバージョンには影響しなかったことがわかりました。

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

…ですから、少なくとも7.1に関してはある種の衝突があるようです。


3

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

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

私は両方のオプションをチェックしましたが

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

アップルが言うようにストーリーボードからですが、それでも私はこの奇妙なエラーを受け取りました。

注意:このエラーはIOS-10バージョンでのみ表示され、IOS-11バージョンでは表示されません。多分それはxCodeからのバグです。ありがとう


0

これが私が見つけたものです(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

私の場合、私はこのようにUITableviewCellセルを使用して返すヘッダービューを作成しましたviewForHeaderInSection

return cell

これをに変更しました

return cell.contentView 

私のために働いた。


0

私の場合

viewForHeaderInSection

スーパークラスにデイジーすることに煩わされていなかった遠く離れた派生クラスに実装されました。


0

viewForHeaderInSection呼び出されない理由は、次の2つの理由のいずれかです。

をセットアップしなかったかUITableViewDelegateUITableViewDelegate誤ってセットアップしたかのいずれかです。


0

私の場合、それは私が実装しなかった原因でした:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat

-1

時々 、設定tableview.delegateまたはdatasource = nilviewWillAppear:またはviewDidAppear:方法この問題を引き起こす可能性があります。これを行わないようにしてください...


-1

次の2つのメソッドをSwift 2プロジェクトからカットアンドペーストしてSwift 3プロジェクトに貼り付けましたが、Swift 3ではこれらのメソッドの最初のパラメーター名の前に「-」を付ける必要があるためです。

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 44.0
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView        
    return headerView
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.