为什么UITableViewCell实例不能用作计算属性?

时间:2014-12-19 18:20:46

标签: ios uitableview swift

我似乎无法做到这一点,单元格的文本标签显示为空:

var cell:UITableViewCell {

    var c:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier") as? UITableViewCell

    if c == nil {
        c = UITableViewCell(style: .Value1, reuseIdentifier: "reuseIdentifier")
    }

    return c!
}

但是,如果我这样做,一切正常:

var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier") as? UITableViewCell

if cell == nil {
    cell = UITableViewCell(style: .Value1, reuseIdentifier: "reuseIdentifier")

}

我不明白为什么。这里有什么我想念的吗?

谢谢!

编辑:使用计算属性的代码

var cell:UITableViewCell {

    var c:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier") as? UITableViewCell

    if c == nil {
        c = UITableViewCell(style: .Value1, reuseIdentifier: "reuseIdentifier")
        c!.selectionStyle = .None
        c!.backgroundColor = Theme.Colors.viewBackgroundColor
        c!.textLabel?.textColor = Theme.Colors.fadedTextColor
        c!.textLabel?.font = UIFont(name: kFontDINCondRegular, size: 21.0)
        c!.detailTextLabel?.textColor = Theme.Colors.fadedTextColor
        c!.detailTextLabel?.font = UIFont(name: kFontDINCondRegular, size: 21.0)
    }

    return c!
}

switch indexPath.row {
case 0:
    cell.textLabel?.text = self.lastMonthDescription
    cell.detailTextLabel?.text = self.model.foldersContactedLastMonth.stringValue
case 1:
    cell.textLabel?.text = self.currentMonthDescription
    cell.detailTextLabel?.text = self.model.foldersContactedCurrentMonth.stringValue
case 2:
    cell.textLabel?.text = FSLocalizedString(Localizable.THIS_WEEK).uppercaseString
    cell.detailTextLabel?.text = self.model.foldersContactedCurrentWeek.stringValue
case 3:
    cell.textLabel?.text = FSLocalizedString(Localizable.TODAY).uppercaseString
    cell.detailTextLabel?.text = self.model.foldersContactedToday.stringValue
default: break

}

return cell

1 个答案:

答案 0 :(得分:4)

我不确定您的目标是什么,但是每次访问cell计算属性时,您的实现都会使新单元格出列。这意味着有这两行:

cell.textLabel?.text = self.lastMonthDescription
cell.detailTextLabel?.text = self.model.foldersContactedLastMonth.stringValue

您正在创建两个不同的单元格。 您将在最终回归中返回一个全新的单元格。

计算属性就是这样,每次尝试访问它们时都会计算它们,而不是实际存储在内存中。

您可以尝试使用惰性变量:

lazy var cell: UITableViewCell = {
    // blah
    return cell
}()

请注意,我这里没有使用计算属性。相反,我正在分配创建单元格的内联闭包的结果。通过使其变为惰性,它不会在第一次访问cell之前调用闭包,但结果存储在内存中,这样您就可以继续操作相同的单元实例,而不是每次都创建一个新的实例。 / p>