正しいデリゲートとデータソースのリンケージを使用してテーブルビューをセットアップしました。reloadData メソッドは、データソースとデリゲート メソッドを呼び出しますviewForHeaderInSection:
。
どうしてこんなことに?
正しいデリゲートとデータソースのリンケージを使用してテーブルビューをセットアップしました。reloadData メソッドは、データソースとデリゲート メソッドを呼び出しますviewForHeaderInSection:
。
どうしてこんなことに?
を使用するにtableView:viewForHeaderInSection:
は、 も実装する必要がありますtableView:heightForHeaderInSection:
。これにより、ヘッダーのゼロ以外の適切な高さが返されます。また、 も実装していないことを確認してくださいtableView:titleForHeaderInSection:
。どちらか一方 (viewForHeader
またはtitleForHeader
) のみを使用する必要があります。
秘訣は、これら 2 つのメソッドが異なるUITableView
プロトコルに属してtableView:titleForHeaderInSection:
いることです。UITableViewDataSource
tableView:viewForHeaderInSection
UITableViewDelegate
つまり、次のことを意味します。
dataSource
メソッドを実装しても、自分自身を のとしてのみ割り当てた場合
UITableView
、
tableView:viewForHeaderInSection
実装は無視されます。
tableView:viewForHeaderInSection
の優先度が高くなります。両方のメソッドを実装し、自分自身を
dataSource
および のdelegate
として割り当てるとUITableView
、セクション ヘッダーのビューが返されますが、あなたのビューは
tableView:titleForHeaderInSection:
無視されます。
私も削除しようとしtableView:heightForHeaderInSection:
ました; それはうまく機能し、上記の手順に影響を与えないようでした。tableView:viewForHeaderInSection
しかし、ドキュメントには、 が正しく機能するために必要であると書かれています。安全のために、これも実装するのが賢明です。
@rmaddy はルールを 2 回誤って述べています。実際には、も実装する必要はなく、 と の両方を呼び出しても問題ありtableView:viewForHeaderInSection:
ません。記録のために、ルールを正しく述べます。tableView:heightForHeaderInSection:
titleForHeader
viewForHeader
ルールは、viewForHeader
何らかの方法でヘッダーに高さを与えない限り呼び出されないということです。これは、次の 3 つの方法を任意に組み合わせて実行できます。
実装しtableView:heightForHeaderInSection:
ます。
テーブルの を設定しますsectionHeaderHeight
。
呼び出しますtitleForHeader
(これにより、ヘッダーにデフォルトの高さがなければ、ヘッダーにデフォルトの高さが与えられます)。
これらのことを何も行わないと、ヘッダーがなくなり、viewForHeader
呼び出されなくなります。これは、高さがないと、ランタイムがビューのサイズを変更する方法を認識できないためです。
実装が return の場合tableView:heightForHeaderInSection:
、UITableViewAutomaticDimension
thentableView:viewForHeaderInSection:
は呼び出されないことに簡単に注意してください。
UITableViewAutomaticDimension
UITableViewHeaderFooterView
デリゲート メソッドが設定された標準が使用されることを前提としていtableView:titleForHeaderInSection:
ます。
のコメントからUITableView.h
:
tableView:heightForHeaderInSection:
orからこの値を返すと、タイトルが nil でない場合、ortableView:heightForFooterInSection:
から返される値に適合する高さが得られます。tableView:titleForHeaderInSection:
tableView:titleForFooterInSection:
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 では何らかの競合があるようです。
が呼び出されない理由viewForHeaderInSection
は、次の 2 つの理由のいずれかです。
を設定していないかUITableViewDelegate
、UITableViewDelegate
正しく設定していません。
またはメソッドでtableview.delegate
またはを設定すると、この問題が発生することがあります。これをしないように注意してください...datasource = nil
viewWillAppear:
viewDidAppear: