Ios Swift配置自定义单元格

Ios Swift配置自定义单元格,ios,swift,uitableview,Ios,Swift,Uitableview,我在uitableview控制器中有以下代码: var results: [Item] = [] ... func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("OrderCell") as! OrderTableVi

我在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控制器中填写此字段
itemNo
itemPrice

在我看来,这样做会更好:

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正在重用单元格的实例。每次显示一个单元格时,都会再次调用CellForRowatineXpath,并且需要重新布置该单元格。您不希望它的数据是永久的

在我看来,这样做会更好:

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正在重用单元格的实例。每次显示一个单元格时,都会再次调用CellForRowatineXpath,并且需要重新布置该单元格。您不希望它的数据是永久的

IMHO,这比将视图相关逻辑添加到您的
UITableViewController
要好

iOS应用程序经常使用“模型-视图-控制器”模式,您可以在这里看到。虽然这种模式的细节可能有所不同,但通常认为拥有“松散耦合”的组件是一件好事。也就是说,控制器不应该关心哪些表单元(视图)标签显示了哪些模型信息

此外,在视图中封装这样的逻辑可以让您在将来清楚地观察
(您的模型)的更新(完全不需要额外的控制器交互)。您可以通过键值观察之类的方式来完成自动更新

MVC上的Wikipedia页面有一个极好的图形来解释组件通常是如何交互的


来源:

IMHO,这比将视图相关逻辑添加到您的
UITableViewController
要好

iOS应用程序经常使用“模型-视图-控制器”模式,您可以在这里看到。虽然这种模式的细节可能有所不同,但通常认为拥有“松散耦合”的组件是一件好事。也就是说,控制器不应该关心哪些表单元(视图)标签显示了哪些模型信息

此外,在视图中封装这样的逻辑可以让您在将来清楚地观察
(您的模型)的更新(完全不需要额外的控制器交互)。您可以通过键值观察之类的方式来完成自动更新

MVC上的Wikipedia页面有一个极好的图形来解释组件通常是如何交互的


来源:

这在iOS中是一个有争议的话题,如果你把你的
UITableViewCell
看作一个视图,那么你就把数据传递给视图,而视图的目的只是可视化,但正如我所说,在这种情况下没有银弹在iOS中这是一个有争议的话题,如果您将
UITableViewCell
视为一个视图,那么您正在将数据传递给视图,而视图的目标只是可视化,但正如我所说,在这种情况下没有银弹谢谢,我如何避免每次显示单元格时都调用setupCell?谢谢,我如何避免每次显示单元格时调用setupCell?谢谢,我怎样才能避免每次显示手机时都打电话?我不相信你能做到。由于UIKit使用基于队列的方法(而不是将所有单元格保存在内存中),因此每当在不同的索引位置重用单元格时,它需要调用
cellforrowatinedexpath
,以获得适当的单元格设置。如果您在滚动时遇到性能问题,我会首先检查您的模型层。谢谢,我如何避免每次显示单元格时调用setupCell?我不相信您可以。由于UIKit使用基于队列的方法(而不是将所有单元格保存在内存中),因此每当在不同的索引位置重用单元格时,它需要调用
cellforrowatinedexpath
,以获得适当的单元格设置。如果您在滚动时遇到性能问题,我会首先检查您的模型层。