Swift配置自定义单元格

时间:2016-04-18 21:29:30

标签: ios swift uitableview

我在uitableview控制器中有这个代码:

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控制器填充这些字段itemNoitemPrice

2 个答案:

答案 0 :(得分:2)

恕我直言,这比向UITableViewController添加视图相关逻辑更好。

iOS应用经常使用"模型 - 视图 - 控制器"模式,你在这里。虽然这种模式的细节可能会有所不同,但通常认为松散耦合"是一件好事。组件。这意味着,控制器不应该关注哪个表格单元格(视图)标签显示哪些模型信息。

此外,将这样的逻辑封装在视图内部就像这样,可以让您在将来干净地观察Item(您的模型)的更新(完全不需要额外的控制器交互)。您可以通过键值观察等方式完成此自动更新。

MVC上的维基百科页面有一个很好的图形来解释组件通常如何交互。

来源:https://en.wikipedia.org/wiki/Model–view–controller#Description

答案 1 :(得分: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,tableview正在重用单元格的实例。每次显示一个单元格时,都会再次调用cellForRowAtIndexPath,并且需要再次布置该单元格。您不会将其数据永久化。