正しいデリゲートとデータソースのリンケージでテーブルビューを設定しました。reloadDataメソッドは、データソースとデリゲートメソッドを呼び出しますviewForHeaderInSection:
。
どうしてこんなことに?
sectionHeaderHeight
か?
正しいデリゲートとデータソースのリンケージでテーブルビューを設定しました。reloadDataメソッドは、データソースとデリゲートメソッドを呼び出しますviewForHeaderInSection:
。
どうしてこんなことに?
sectionHeaderHeight
か?
回答:
を使用するにtableView:viewForHeaderInSection:
は、も実装する必要がありますtableView:heightForHeaderInSection:
。これにより、ヘッダーに適切なゼロ以外の高さが返されます。また、も実装しないようにしてくださいtableView:titleForHeaderInSection:
。どちらか一方(viewForHeader
またはtitleForHeader
)のみを使用してください。
numberOfSections
。
titleForHeaderInSection:
を実装 viewForHeaderInSection:
し、後者から返されるビューがのサブクラスであるUITableViewHeaderFooterView
場合textLabel.text
は、自動的にtitleForHeaderInSection:
文字列のすべて大文字バージョンに設定されます。この動作を防ぐtitleForHeaderInSection:
には、継承しないでカスタムラベルを実装または使用しないでくださいtextLabel
。
トリックは、これら2つの方法が異なるに属していることであるUITableView
プロトコル:tableView:titleForHeaderInSection:
あるUITableViewDataSource
プロトコル方法、tableView:viewForHeaderInSection
に属しますUITableViewDelegate
。
つまり:
メソッドを実装し、自分自身をのとしてのみ割り当て
dataSource
たUITableView
場合、
tableView:viewForHeaderInSection
実装は無視されます。
tableView:viewForHeaderInSection
優先度が高くなります。あなたがメソッドの両方を実装し、両方として自分を割り当てた場合
dataSource
とdelegate
についてUITableView
、あなたはセクションヘッダーのビューを返しますが、あなたは
tableView:titleForHeaderInSection:
無視されます。
私も削除してみましたtableView:heightForHeaderInSection:
。それは問題なく動作し、上記の手順に影響を与えていないようでした。しかし、ドキュメントには、がtableView:viewForHeaderInSection
正しく機能するために必要であると記載されています。安全のため、これも実装するのが賢明です。
UITableViewDelegate
にself
私は、と思ったので、tableView:viewForHeaderInSection
あるUITableViewDataSource
方法。ありがとうございました!
titleForHeader
固有のサイズを持つaのいずれかによって、それを達成できます。固有のサイズは、フォントファミリとサイズに基づいて計算されます。
現実には、:@rmaddyは二回、ルールを虚偽表示しているtableView:viewForHeaderInSection:
んではないあなたも実装することを必要とtableView:heightForHeaderInSection:
し、また、それは両方を呼び出すために完全に罰金ですtitleForHeader
とviewForHeader
。私は記録のためだけにルールを正しく述べます:
ルールはviewForHeader
、どういうわけかヘッダーに高さを与えない限り呼び出されないということです。これは、次の3つの方法の任意の組み合わせで行うことができます。
実装しtableView:heightForHeaderInSection:
ます。
テーブルのを設定しますsectionHeaderHeight
。
呼び出しtitleForHeader
(これにより、ヘッダーがない場合は、ヘッダーにデフォルトの高さが設定されます)。
これらのことを何も行わない場合、ヘッダーviewForHeader
はなく、呼び出されません。これは、高さがなければ、ランタイムはビューのサイズを変更する方法を認識できないため、高さを要求する必要がないからです。
tableView:viewForHeaderInSection:
:「このメソッドtableView:heightForHeaderInSection:
は、も実装されている場合にのみ正しく機能します。」
titleForHeaderInSection
し、viewForHeaderInSection
?テーブルビューは、2つのうちの1つだけを呼び出します(現時点ではどちらが優先されるかを忘れます)。
viewForHeader
があります。私はこれを経験しましたが、私が呼び出されてヘッダーがうまく表示されたところ、ある日まで、私の側に変更はありませんでした。それが呼び出されるための最小要件が何であるかを発見するために実験を始めたときです。そして今、私は知っています。そして今、あなたもそうです。viewForHeader
viewForHeader
与えるestimatedSectionHeaderHeight
とsectionHeaderHeight
値は私の問題を修正しました。例えば、
self.tableView.estimatedSectionHeaderHeight = 100
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
rmaddyの答えから離れて、ヘッダービューを非表示にしようとしていて、「tableView:heightForHeaderInSection」に対して0.0fを返し、から高さ0のビューを返していましたtableView:viewForHeaderInSection
。
変更した後return 1.0f
にreturn 0.0f
中にtableView:heightForHeaderInSection
、デリゲートメソッドがtableView:viewForHeaderInSection
実際に呼び出されました。
「tableView:heightForHeaderInSection」を使用しなくても、目的の効果が機能することがわかります。しかし、これは「tableView:heightForHeaderInSection」デリゲートメソッドが呼び出されて問題が発生している他のユーザーに役立つ場合があります。
tableView:heightForHeaderInSection:
ヘッダーの高さを実装し、> 0に設定する必要があります。
このデリゲートメソッドはメソッドと連動していviewForHeaderInSection:
ます。
これがお役に立てば幸いです。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
それはあなたの実装ならばことは注目に値します簡単にtableView:heightForHeaderInSection:
戻りUITableViewAutomaticDimension
、その後、tableView:viewForHeaderInSection:
呼び出されません。
UITableViewAutomaticDimension
はUITableViewHeaderFooterView
、デリゲートメソッドが入力された標準が使用されることを前提としていtableView:titleForHeaderInSection:
ます。
のコメントからUITableView.h
:
この値を返す
tableView:heightForHeaderInSection:
かtableView:heightForFooterInSection:
から返された値に収まる高さが結果tableView:titleForHeaderInSection:
やtableView:titleForFooterInSection:
タイトルがnilでない場合に。
estimatedSectionHeaderHeight
何らかの値に設定した場合、tableView:viewForHeaderInSection
呼び出されます(行の自動ディメンションの機能と同様に)
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に関してはある種の衝突があるようです。
同じ問題が発生しましたが、xCode 9からの自動高さ計算を使用していたため、上記のように明示的な高さ値を指定できません。いくつかの実験の後、私は解決策を得ました、私たちはこのメソッドをオーバーライドする必要があります、
-(CGFloat)tableView:(UITableView *)tableView
estimatedHeightForHeaderInSection:(NSInteger)section
{
return 44.0f;
}
私は両方のオプションをチェックしましたが
アップルが言うようにストーリーボードからですが、それでも私はこの奇妙なエラーを受け取りました。
注意:このエラーはIOS-10バージョンでのみ表示され、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)
}
}
私の場合、私はこのようにUITableviewCell
セルを使用して返すヘッダービューを作成しましたviewForHeaderInSection
return cell
これをに変更しました
return cell.contentView
私のために働いた。
私の場合
viewForHeaderInSection
スーパークラスにデイジーすることに煩わされていなかった遠く離れた派生クラスに実装されました。
viewForHeaderInSection
呼び出されない理由は、次の2つの理由のいずれかです。
をセットアップしなかったかUITableViewDelegate
、UITableViewDelegate
誤ってセットアップしたかのいずれかです。
次の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
}
heightForHeaderInSection:
実装しますか?