2017-04-10 59 views
1

我试图限制添加到子视图在我的UITableViewCell,但我得到错误Unable to interpret '|' character, because the related view doesn't have a superview编程添加约束细胞:找不到它的内容查看

这里是我的自定义UITableViewCell类:

class MessageTableViewCell: UITableViewCell { 

var titleLabel: UILabel { 
    get { 
     let titleLabel = UILabel() 
     titleLabel.translatesAutoresizingMaskIntoConstraints = false 
     titleLabel.font = UIFont.boldSystemFont(ofSize: self.defaultFontSize) 

     return titleLabel 
    } 
} 

var bodyLabel: UILabel { 
    get { 
     let bodyLabel = UILabel() 
     bodyLabel.translatesAutoresizingMaskIntoConstraints = false 
     bodyLabel.font = UIFont.systemFont(ofSize: self.defaultFontSize) 

     return bodyLabel 
    } 
} 
var thumbnailView: UIImageView { 
    get { 
     let thumbnailView = UIImageView() 
     thumbnailView.translatesAutoresizingMaskIntoConstraints = false 
     thumbnailView.layer.cornerRadius = CGFloat(TableViewCellArrangements.kMessageTableViewCellAvatarHeight/2.0) 
     thumbnailView.layer.masksToBounds = true 

     return thumbnailView 
    } 
} 
override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 

    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    configureSubviews() 
} 

private func configureSubviews() { 

    self.contentView.addSubview(thumbnailView) 
    self.contentView.addSubview(titleLabel) 
    self.contentView.addSubview(bodyLabel) 

    let views: [String : Any] = ["thumbnailView" : thumbnailView, 
           "titleLabel" : titleLabel, 
           "bodyLabel" : bodyLabel] 
    let metrics: [String : Any] = ["thumbSize" : TableViewCellArrangements.kMessageTableViewCellAvatarHeight, 
            "padding" : 15, 
            "right" : 10, 
            "left" : 5] 
    //The next line throws an exception. In fact, all the `let constraint` code will throw exceptions 
    let constraint1 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-left-[thumbnailView(thumbSize)]-right-[titleLabel(>=0)]-right-|", options: .alignAllLeft, metrics: metrics, views: views) 
    contentView.addConstraints(constraint1) 
    let constraint2 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-left-[thumbnailView(thumbSize)]-right-[bodyLabel(>=0)]-right-|", options: .alignAllLeft, metrics: metrics, views: views) 
    contentView.addConstraints(constraint2) 
    let constraint3 = NSLayoutConstraint.constraints(withVisualFormat: "V:|-right-[thumbnailView(thumbSize)]-(>=0)-|", options: .alignAllLeft, metrics: metrics, views: views) 
    contentView.addConstraints(constraint3) 

    if self.reuseIdentifier == TableViewCellArrangements.MessengerCellIdentifier { 
     let constraint4 = NSLayoutConstraint.constraints(withVisualFormat: "V:|-right-[titleLabel(20)]-left-[bodyLabel(>[email protected])]-left-|", options: .alignAllLeft, metrics: metrics, views: views) 
     contentView.addConstraints(constraint4) 
    } else { 
     let constraint5 = NSLayoutConstraint.constraints(withVisualFormat: "V:|[titleLabel]|", options: .alignAllLeft, metrics: metrics, views: views) 
     contentView.addConstraints(constraint5) 
    } 
} 

由于如上所述,约束线是抛出异常的地方。不过,我在在设置约束之前将contentView添加到contentView,所以我很困惑为什么它认为有superview。

谢谢!

+0

你在哪里创建你的子视图?我看到'init()',它调用'configureSubviews()',它调用'.addSubview(thumbnailView)'...但我没有看到'thumbnailView'被定义或创建在任何地方? – DonMag

+0

@DonMag好点。我在问题主体中省略了一些代码,并且已经将它添加回来了 - 对于'thumbnailView'和'bodyLabel' – daspianist

回答

1

您每次引用元素时都会重新创建元素的新实例。试着这样说:

var xtitleLabel: UILabel? 

var titleLabel: UILabel { 
    get { 
     if xtitleLabel == nil { 
      xtitleLabel = UILabel() 
     } 
     xtitleLabel?.translatesAutoresizingMaskIntoConstraints = false 
     xtitleLabel?.font = UIFont.boldSystemFont(ofSize: self.defaultFontSize) 

     return xtitleLabel! 
    } 
} 

您还指titleLabel整个代码 - 这只是导致“一度创造”的过程。

+0

谢谢!这使得更多的意义为什么它不认为我有一个有效的观点。 – daspianist