web-dev-qa-db-ja.com

tableViewセクションのヘッダーが消えますSWIFT

TableViewを設定して、セルに触れると高さが拡大してより多くの情報が表示されるようにします。 tableViewには5つのセクションがあります。

バグがあります:セルが展開すると、そのセルの下のすべてのheadersCellsが非表示になります。コンソールは次を出力します:「[31233:564745]再利用されるテーブルセルのインデックスパスがありません」

ストーリーボードには、2つのカスタムセルがあります。データを保持するセルの「myCell」と、ヘッダーの「headerCell」です。

func tableView(tableView:UITableView、didSelectRowAtIndexPath indexPath:NSIndexPath){

   let thisGoal : GoalModel = goalArray[indexPath.section][indexPath.row]


    if self.currentPath != nil && self.currentPath == indexPath  {
        self.currentPath = nil
    } else {
        self.currentPath = indexPath
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}

更新の開始/終了の間にtableView.reloadData()を入力すると、ヘッダーの背景が黒くなり、アニメーションが失われますが、正常に機能します。

ヘッダーのすべてのものが宣言されています:func tableView(tableView:UITableView、viewForHeaderInSection section:Int)-> UIView?

私は何が欠けていますか? tableViewにはまだアニメーションがあり、背景はclearColor()のままにしておきたいです。

前もって感謝します。 Objective Cの回答を読みましたが、それらを私のために働かせることができませんでした。 Swiftヘルプ。

問題は、再利用されるテーブルセルのインデックスパスがないことだと思います。

36
Mason Ballowe

コンソールの出力で答えを見つけました。ヘッダー関数で次のコードを使用します。

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

headerCellまたは再利用可能な識別子を返さないでください。 reuseIdentifier.contentView。私にとっては:return headerCell!.contentView

109
Mason Ballowe

付け加えると、セルのcontentViewを参照できない理由について、本来あるはずだったよりもずっと長い間WAYに当惑しました。カスタムクラス(UITableViewHeaderFooterViewではなくUITableViewCellを使用)は、毎回致命的なエラーを返します。したがって、カスタムスタイリングがUITableViewHeaderFooterViewクラスの下で設定されていることを確認してください。

class CustomHeaderCell: UITableViewHeaderFooterView {

また、次のようにresuableIdentiferを登録する必要があります。

tableView.registerNib(UINib(nibName: "HeaderCell", bundle: nil), forHeaderFooterViewReuseIdentifier: "CellHeader")

それからこの悪い男の子:

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("CellHeader") as! CustomHeaderCell!
    return headerCell!.contentView
}
16
David West

私はまだ50の評判に達していないので、前の回答にコメントすることはできません。そのため、これを別の回答として記載することをおizeびします。

ContentViewを返すと、関数は機能しますが、reuseIdentifier(headerCell)に対して行われたすべてのフォーマットが削除されます。

headerCell.backgroundColor = UIColor.cyanColor()

これはheaderCellにシアン色を提供しません

これを修正するには、フォーマット行に「.contentView」を追加するだけです

headerCell.contentView.backgroundColor = UIColor.cyanColor()
9
Nathan Wharry

アプリをIOS 10-Apple開発者APIドキュメントのテーブルヘッダーに追加しました。追加したとき、以下、欠落しているヘッダーが再登場しました!

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return 44 // where 44 is the header cell view height in my storyboard
}
5
Frans

UITableViewHeaderFooterViewの代わりにdequeueメソッドを使用してセルを返していたため、同じバグがありました。

解決:

  • ビュー階層の外側にビューを追加する
  • タイプをUITableViewHeaderFooterViewに設定します
  • カスタマイズ
  • _@IBOutlet_へのリンク
  • func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?でアウトレットを返します

一般的な落とし穴:

ヘッダーサイズを設定することを忘れないでください。アウトレットを強力に設定することを忘れないでください。

2
Antzi

TableviewcellをUIView内にラップできます

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

let containerView = UIView()
guard let headerCell = tableView.dequeueReusableCell(withIdentifier: "MyHeaderView") as? MyHeaderView else { fatalError(" Failed to load MyHeaderView") }
containerView.addSubview(headerCell)
return containerView
}
0
Sonu VR