2016-08-06 6 views
0

...のUITableViewセル繰返し&古いデータ

カスタムUITableViewCells(「CustomCell」)のUITableViewを含むアプリ。各CustomCellには、ペン( "CustomView")を介して1つまたは複数のカスタムビューを持つUIStackViewが含まれています。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierCustomCell, forIndexPath: indexPath) as! CustomCell 
    configureCell(cell, atIndexPath: indexPath) 
    return cell 
} 

問題は、セルが再利用されていたように、細胞は「古い」データが含まれているというものであった:次のように私はCustomCellを再利用します。次のようにこれを修正するために、私はCustomCellでprepareForReuseメソッドをオーバーライド:

override func prepareForReuse() { 
    super.prepareForReuse() 

    for case let view as CustomView in stackView.subviews { 
     view.removeFromSuperview() 
    } 
} 

を次にlayoutSubviewsで、私は後ろにサブビューを追加します。これがあれば

override func layoutSubviews() { 
    super.layoutSubviews() 

    if stackView.subviews.isEmpty { 
     addCustomViewsToCell() 
    } 
} 

パフォーマンスは、これまでの罰金だが、好奇心適切なアプローチか、将来的に規模の問題に遭遇するかどうかを判断します。私はこれまでに別の実行可能なアプローチを見つけることができませんでした。

ありがとうございました

答えて

0

あなたのコードを再利用するコードは正しいです。一般的なアプローチは、変数を設定するか、カスタムセルに関数を呼び出すことによってcellForRowAtIndexPath関数の中で、あなたのセルのデータを設定することです:

let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierCustomCell, forIndexPath: indexPath) as! CustomCell 
cell.data = myData[indexPath.row] // where myData is an array of type [Data] 
return cell 

あなたのセルが新しいデータを表示するために、独自のレイアウトを担当することになります。

var data: Data { 
    didSet { 
     // configure and refresh your UI here 
    } 
} 

あなたの問題はconfigureCell機能と関係があると思われます。可能であれば、このコードをセルのロジックに移動してください。これはよりクリーンで理解しやすいでしょう。

スタックビューのコンテンツにスタックビューが含まれていない場合は、パフォーマンスはまだまだ良いかもしれませんが、複雑さが増しても古いデバイスではフレームレートが低下することがあります。

+0

セルのサブクラスに 'configureCell'を置くと、MVCに違反します。それはうまくいくが、ベストプラクティスではない。 – Paulw11

+0

提案していただきありがとうございます。 'configureCell'関数は実際にデータ値を設定していましたが、わかりやすくするために' cellForRowAtIndexPath'に移動しました。それは、セルが再利用の準備ができているときに、階層から 'CustomView'を削除せずに、再利用の問題がまだ現れているということです。おそらく私は更新の代わりにサブビューを追加しているからでしょうか?サブビューの数はセル間で変わる可能性があります。 – JKahn

関連する問題