2016-04-18 14 views
0

私はのUITableViewコントローラで、このコードを持っている:スウィフトのconfigureカスタムセル

var results: [Item] = [] 
... 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("OrderCell") as! OrderTableViewCell! 
    cell.item = results[indexPath.row] 
    return cell 
} 

とOrderTableViewCell.swift:

class OrderTableViewCell: UITableViewCell { 


    var item: Item! { 
     didSet { 
      self.setupCell() 
     } 
    } 

    @IBOutlet var itemNo: UILabel! 
    @IBOutlet var itemPrice: UILabel! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
    } 

    func setupCell() { 
     itemNo.text = order.document_no 
     itemPrice.text = order.sum 
    } 

} 

は今、私は知っている必要がありますがdidSetで(セットアップセルにこの良い方法です)、またはこのフィールドをuitableview controllerからitemNoitemPriceと入力する方が良いでしょうか?

+0

あなたは、あなたがビューにデータを渡しているビューとしてあなた 'UITableViewCell'を考える場合には、iOSので物議を醸す話題だそれだけで視覚化された目的だが、私が言ったようにありこの場合、銀色の弾丸はありません –

答えて

2

IMHO、ビュー依存のロジックをUITableViewControllerに追加するよりも優れています。

iOSアプリケーションでは、ここにある「モデルビューコントローラ」パターンがよく使用されます。このパターンの詳細はさまざまですが、一般的に「疎結合」されたコンポーネントを持つことは良いことです。つまり、コントローラーは、どの表のセル(ビュー)ラベルがどのモデル情報を表示しているかに関係するべきではありません。

また、このようなビューのこの内部のようなあなたのロジックをカプセル化すると、きれいに将来的にItem(モデル)への更新を観察するために、あなたが設定されます(完全に追加のコントローラとの対話の必要性を排除します)。この自動更新は、Key-Value Observingなどの方法で実行できます。

MVCのWikipediaページには、コンポーネントが通常どのように対話するかを説明する優れた図があります。

出典:https://en.wikipedia.org/wiki/Model–view–controller#Description

+0

ありがとう、私はセルが表示されるたびにsetupCellコールを避けることができますか? –

+0

私はあなたができるとは思わない。 UIKitは(すべてのセルをメモリに保存するのではなく)キューベースのアプローチを使用するので、セルが別のindexPathで再利用されたときは常に適切なセル設定を得るために 'cellForRowAtIndexPath'を呼び出す必要があります。スクロールでパフォーマンスの問題が発生している場合は、まずモデルレイヤーを確認します。 –

1

よりよいそうのように行われるだろうと私には思える:

これを使用して
func setupCell(_data:DataObject) { 
    // update layout depending on data 
    itemNo.text = _data.document_no 
    itemPrice.text = _data.sum 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
// this way avoids forced unwrapping. much safer 
if let cell = tableView.dequeueReusableCellWithIdentifier("OrderCell") as? OrderTableViewCell{ 
     cell.setupCell(results[indexPath.row]) 
     return cell 
    } 
    return UITableViewCell() 
} 

ためdequeueReusableCellWithIdentifierのテーブルビューは、セルのインスタンスを再利用していることに注意してください。セルが表示されるたびに、cellForRowAtIndexPathが再び呼び出され、そのセルを再度レイアウトする必要があります。そのデータは永久的ではありません。

+1

ありがとう、私はどのようにセルが表示されるたびにsetupCell呼び出しを避けることができますか? –