2017-04-10 7 views
0

私はUITableViewCellのタイプを使用して、ユーザーが実行時に必要な数のUITextViewを追加/削除できるようにしました。実行時に動的レイアウトコンテンツでセルを再利用する

このタイプのセルを再利用/デキューしようとすると、テーブルビューのセルが上下にスクロールしたときに重なり始めることがあるため、問題が発生しています。私はデキュー/セルを返すとき、私はセットアップメソッドを実行しています(これは内部的にすべての前のビューを削除するティアダウンメソッドを開始します)、モデルを使用して、必要なビューとレイアウトの制約をすべて設定/復元します。

if let cell = tableView.dequeueReusableCell(withIdentifier: "MultipleContentCell", for: indexPath) as? MultipleChoiceTableViewCell { 
        cell.setupCellWithModel(model: model) 
        cell.setNeedsUpdateConstraints() 
        cell.updateConstraintsIfNeeded() 
        cell.delegate = self 

        return cell 
       } 

細胞は時々テーブルビューに重なっていることを、なぜ私は本当に理解することはできませんが、私はそれがその場で再作成されたレイアウトに関係している推測しています。私はこれらのタイプの細胞を再利用せず、単にリストに保存することを検討しています。

私の質問は:再利用可能なセルは、常に同じ一般的なUIViewレイアウトを持つと仮定し、コンテンツのみが変更されますか?私はこれらのタイプの細胞を再利用することを想定していませんか?それとも誰かがこれを経験したことがありますか?

おかげ

答えて

0

UITextViewを使用すると、セルをデキューし、削除することはありませんたびに作成されます。その使用関数prepareForReuse()を修復する。 MultipleChoiceTableViewCellでデキューする前にセルが何をすべきかを定義する必要があります。たとえば:

override func prepareForReuse() { 
    super.prepareForReuse() 

    for view in speciesName.subviews { 
     if view is UITableView { 
      view.removeFromSuperview() 
     } 
    } 
} 

私は数日前に同様の質問を追加しました:

Cells in UITableView overlapping. Many cells in one place

あなたには、いくつかの疑問を持っている場合は、私はもっと明日あなたを助けるために試すことができます。 乾杯!

0

一般に、はい。セルの物理レイアウトを静的にし、リサイクルするときに内容を変更するだけです。 cellForRow(at:)でビューをセルに追加すると、余分なフィールドを管理して重複したビューを避けることができます。

ユーザーインタラクションに基づいてテーブルビューセルに可変数のビューを追加する場合は、セルをオンザフライで追加または削除する必要がある場合があります。

containerView.subviews.forEach { $0.removeFromSuperview() } 
:これを処理する

一つの方法は、コンテナビューにテキストフィールドのすべてを入れて、そのコンテナビューにコンセントを追加し、単にあなたのprepareForReuseやcellForRowAt機能で、このようなコードを使用することです

関連する問題