我在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
?
答案 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,并且需要再次布置该单元格。您不会将其数据永久化。