为什么 UITableViewCell textLabel 属性 是可选的?
Why is a UITableViewCell textLabel property optional?
一个UITableViewCell
的detailTextLabel
should be optional, which is documented,但是为什么textLabel
属性是可选的?
虽然没有正确记录,但它遵循相同的规则 - 必须设置正确的样式。也就是说,如果您使用自定义单元格——通常通过界面构建器配置,自定义单元格被初始化——在这种情况下,默认视图的 none 被添加到单元格,因为这会很浪费。
如果您使用自定义单元格以外的任何其他样式,它将始终初始化第一个标签,因此您可以放心使用它(但在这种情况下显然不能更改定义,因此它将始终声明为可选)。
简答:为了节省资源。 textLabel 属性 是可选的,以允许延迟初始化 UILabel。换句话说,除非您实际尝试访问它,否则 属性 保持为零。
您可以通过检查 UITableViewCell 的实例在调试器中验证这一点:
let cell = dequeueReusableCellWithIdentifier(MyCell.cellIdentifier, forIndexPath: indexPath) as! MyCell
// check cell.textLabel here in the debugger. should be nil.
cell.textLabel.text = "test" // creates textLabel via lazy initialization
一个UITableViewCell
的detailTextLabel
should be optional, which is documented,但是为什么textLabel
属性是可选的?
虽然没有正确记录,但它遵循相同的规则 - 必须设置正确的样式。也就是说,如果您使用自定义单元格——通常通过界面构建器配置,自定义单元格被初始化——在这种情况下,默认视图的 none 被添加到单元格,因为这会很浪费。
如果您使用自定义单元格以外的任何其他样式,它将始终初始化第一个标签,因此您可以放心使用它(但在这种情况下显然不能更改定义,因此它将始终声明为可选)。
简答:为了节省资源。 textLabel 属性 是可选的,以允许延迟初始化 UILabel。换句话说,除非您实际尝试访问它,否则 属性 保持为零。
您可以通过检查 UITableViewCell 的实例在调试器中验证这一点:
let cell = dequeueReusableCellWithIdentifier(MyCell.cellIdentifier, forIndexPath: indexPath) as! MyCell
// check cell.textLabel here in the debugger. should be nil.
cell.textLabel.text = "test" // creates textLabel via lazy initialization