Ios Swift配置自定义单元格
我在uitableview控制器中有以下代码: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
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
,以获得适当的单元格设置。如果您在滚动时遇到性能问题,我会首先检查您的模型层。