我无法理解为什么某些值已从tableViewController
传递到我的自定义UITableViewCell
,而其他一些值则没有。
在UItableviewController.cellForRowAtIndexPath
我设置了一个包含一些值的单元格,然后返回此单元格:
cell.label1.text = myCustomObject.id
cell.label2.text = myCustomObject.path
cell.myCustomObjectCellMember = myCustomObject
cell.pathCellMember = myCustomObject.path
return cell
在自定义UITableViewCell
方面,在awakeFromNib
方法中,两个第一个单元格成员为Ok,最后两个成员包含nil
。
两个第一个单元格成员和最后两个单元格成员之间的唯一区别是,两个第一个单元格成员被声明为IBOutlet
并链接到故事板,而另外两个未链接到UI。但是,从tableViewController
开始写这些变量应该没问题,对吗?
以下是自定义UITableViewCell
中这些变量的声明:
@IBOutlet weak var label1: UILabel!
@IBOutlet weak var label2: UILabel!
var pathCellMember : String!
var myCustomObjectCellMember: MyCustomObjectCellMember!
记录后(UITableViewCell.awakeFromNib
内),label1.text
和label2.text
显示正确的值,
但pathCellMember
和myCustomObjectCellMember
显示nil
,而不是UItableviewController.cellForRowAtIndexPath
中指定的值。
根据要求,更明确的代码:
class CustomCellTableViewCell: UITableViewCell {
@IBOutlet weak var label1: UILabel!
@IBOutlet weak var label2: UILabel!
var pathCellMember : String!
var myCustomObjectCellMember: MyCustomObjectCellMember!
override func awakeFromNib() {
super.awakeFromNib()
println("label1 : \(self.label1.text!)") //displays the value assigned
println("label2 : \(self.label2.text!)") //displays the value assigned
println("pathCellMember: \(self.pathCellMember!)") //displays nil
println("myCustomObjectCellMember.path : \(self.myCustomObjectCellMember.path)") //displays `nil`
}
谢谢
答案 0 :(得分:2)
在cellForRowAtIndexPath中,您将重用(deque)每个单元格。您需要在此处将vars值分配给每个单元格。虽然唤醒确实设置了初始值,但它们只会在重复使用单元格之前第一次触发。分配cellForRow或willDisplayCell(背景颜色等)中的所有内容。
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/
讨论 出于性能原因,表视图的数据源通常应该在将单元格分配给其tableView:cellForRowAtIndexPath:方法中的行时重用UITableViewCell对象。表视图维护数据源已标记为可重用的UITableViewCell对象的队列或列表。当要求为表视图提供新单元格时,请从数据源对象中调用此方法。如果现有单元格可用,则此方法会使现有单元格出列,或者使用先前注册的类或nib文件创建新单元格。如果没有可用的单元格,并且您没有注册类或nib文件,则此方法返回nil。 如果为指定的标识符注册了类并且必须创建新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:方法来初始化该单元格。对于基于nib的单元格,此方法从提供的nib文件加载单元格对象。如果现有单元可用于重用,则此方法将调用单元的prepareForReuse方法。