将数据从UItableviewController传递到UItableViewcell

时间:2015-04-21 16:16:48

标签: ios uitableview swift

我无法理解为什么某些值已从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.textlabel2.text显示正确的值, 但pathCellMembermyCustomObjectCellMember显示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`
        }

谢谢

1 个答案:

答案 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方法。