131

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

どうしてこんなことに?

4

16 に答える 16

264

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

于 2013-02-25T23:51:41.983 に答える
42

秘訣は、これら 2 つのメソッドが異なるUITableViewプロトコルに属してtableView:titleForHeaderInSection:いることです。UITableViewDataSourcetableView:viewForHeaderInSectionUITableViewDelegate

つまり、次のことを意味します。

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

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

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

于 2014-06-12T07:55:17.307 に答える
28

@rmaddy はルールを 2 回誤って述べています。実際には、も実装する必要はなく、 と の両方を呼び出しても問題ありtableView:viewForHeaderInSection:ません。記録のために、ルールを正しく述べます。tableView:heightForHeaderInSection:titleForHeaderviewForHeader

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

  • 実装しtableView:heightForHeaderInSection:ます。

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

  • 呼び出しますtitleForHeader(これにより、ヘッダーにデフォルトの高さがなければ、ヘッダーにデフォルトの高さが与えられます)。

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

于 2014-10-02T15:14:50.253 に答える
5

実装が return の場合tableView:heightForHeaderInSection:UITableViewAutomaticDimensionthentableView:viewForHeaderInSection:は呼び出されないことに簡単に注意してください。

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

のコメントからUITableView.h:

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

于 2015-07-24T11:41:09.087 に答える
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 では何らかの競合があるようです。

于 2015-07-22T08:56:22.197 に答える
1

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

を設定していないかUITableViewDelegateUITableViewDelegate正しく設定していません。

于 2019-12-05T20:22:15.410 に答える
-1

またはメソッドでtableview.delegateまたはを設定すると、この問題が発生することがあります。これをしないように注意してください...datasource = nilviewWillAppear:viewDidAppear:

于 2015-08-06T16:03:32.207 に答える