【问题标题】:`self.bounds.size.width` in lazy instantiation of UITableViewCellUITableViewCell 的延迟实例化中的`self.bounds.size.width`
【发布时间】:2017-04-10 14:10:28
【问题描述】:

使用 self.bounds.size.width 懒惰地实例化 UILabel 会引发错误。

lazy public var nameLabel = {
    return UILabel (frame: CGRect(10, 0, self.bounds.size.width, 40))
}

错误提示:Value of type '(NSObject) -> () -> TableViewCell' has no member width。

就 UITableViewCell 的编程视图而言,self.bounds.size.width 有什么替代品?

【问题讨论】:

  • 当你在变量的初始化中引用 self 时,你是在引用变量本身,所以你试图访问它尚未初始化的东西。如果你想用屏幕的宽度初始化你必须调用UIScreen.mainScreen().bounds.size.width
  • 单元格不应采用mainScreen() 的宽度,因为UITableView 的实例可能小于UIScreen.mainScreen().bounds.size.width。有没有办法延迟初始化UITableViewCell 的实例?
  • 谢谢@AitorPagán!你帮了我。

标签: ios swift uitableview cgrect


【解决方案1】:

埃里克,试试这个方法

public lazy var nameLabel: UILabel = {
        return UILabel(frame: CGRect(x: 10, y: 0, width: self.bounds.size.width, height: 40))
}()

或

public lazy var nameLabel = UILabel(frame: CGRect(x: 10, y: 0, width: self.bounds.size.width, height: 40))

【讨论】:

  • 就是这样! Xcode 没有自动完成这些方法。
  • 我在CGRect之后切换了.init;添加/删除.init 不会在编译器中引发错误。你知道有什么区别吗?
  • 没有真正的区别。有时您需要在元类型中键入 .init。
  • 你也可以直接说public lazy var nameLabel: UILabel = UILabel(frame: CGRect(x: 10, y: 0, width: self.bounds.size.width, height: 40))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2012-02-21
相关资源
最近更新 更多