2017-08-30 63 views
0
class ChatCollectionViewCell: UICollectionViewCell { 

var chatView: UIView! 
var chatTextView: UITextView! 
var isTextFromCurrentUser: Bool = true 
var chatViewWidth: CGFloat = 200 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    chatView = UIView() 
    chatTextView = UITextView() 
    contentView.addSubview(chatView) 
    contentView.addSubview(chatTextView) 

    setupViews() 

} 

override func layoutSubviews() { 

    if isTextFromCurrentUser { 
     chatView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 10).isActive = true 
     chatTextView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 15).isActive = true 
     chatTextView.backgroundColor = .white 
    } else { 
     chatView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -10).isActive = true 
     chatTextView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -15).isActive = true 
     chatTextView.backgroundColor = UIColor(r: 157, g: 255, b: 164) 
    } 

    chatView.widthAnchor.constraint(equalToConstant: chatViewWidth).isActive = true 
    chatView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true 
    chatTextView.widthAnchor.constraint(equalTo: chatView.widthAnchor, constant: -10).isActive = true 
    chatTextView.topAnchor.constraint(equalTo: chatView.topAnchor, constant: 5).isActive = true 

    chatView.translatesAutoresizingMaskIntoConstraints = false 
    chatTextView.translatesAutoresizingMaskIntoConstraints = false 

} 

func setupViews() { 

    chatView.backgroundColor = .blue 

    chatTextView.font = UIFont.systemFont(ofSize: 16) 
    chatTextView.layer.cornerRadius = 9 
    chatTextView.clipsToBounds = true 
    chatTextView.isScrollEnabled = false 

} 

override func prepareForReuse() { 
    super.prepareForReuse() 
    chatView = nil 
    chatTextView = nil 

    chatView = UIView() 
    chatTextView = UITextView() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

}UICollectionViewCell沒有共同祖先的錯誤(不重複)

(澄清,我設置chatViewWidth並在視圖控制器的cellForRow方法chatTextView.text屬性)

,因此,現在的XCode給出的錯誤如下:「無法激活約束和錨,並且因爲它們沒有共同的祖先。約束或其錨是否引用不同視圖層次中的項?

我查看了許多關於StackOverflow上的常見祖先錯誤的帖子,但沒有一個解決方案解決了我的問題。

這很混亂。 我試着用斷點來分析錯誤,但程序在創建約14個單元左右後崩潰。有時它可以工作,但是當我添加更多單元時,它將開始崩潰。我不確定問題是什麼 - 我的觀點肯定是CollectionViewCell的兒童觀點,對嗎?

謝謝!

+0

你重新創建prepareForReuse的意見,但你不添加新的子視圖。 –

+0

1.您可以將約束設置爲self,而不是來自chatView的超級視圖。意味着你將它們添加到單元格的contentView中。 2.如果iam沒有錯,LayoutSubviews會被調用很多次,爲什麼不在setupViews上設置約束呢? 3. LayoutSubviews不會調用super.layoutSubviews,這可能會帶來一些問題。嘗試在layoutSubviews中打印,如果你想使用prepareForReuse,它應該會出現很多次,如果我沒有錯誤 –

+0

,建議清除模型的內容,而不是刪除它們。之後,再次調用setupView並設置約束。當您設置「isTextFromCurrentUser」時,您可以調用屬性上的didSet方法並更改約束。 –

回答

0

這就是我該怎麼做的......好吧,我會在Storyboard中設置所有的東西,併爲widthConstraint設置一個Outlet ...但是要帶上你的代碼,這應該可行。但它不是testet ... :)

class ChatCollectionViewCell: UICollectionViewCell { 

    var chatView: UIView! 
    var chatTextView: UITextView! 
    var isTextFromCurrentUser: Bool = true { 
     didSet { 
      if isTextFromCurrentUser { 
       NSLayoutConstraint.deactivate(rightAlignmentConstraints) 
       NSLayoutConstraint.activate(leftAlignmentConstraints) 
       chatTextView.backgroundColor = .white 

      } else { 
       NSLayoutConstraint.deactivate(leftAlignmentConstraints) 
       NSLayoutConstraint.activate(rightAlignmentConstraints) 

       chatTextView.backgroundColor = UIColor(r: 157, g: 255, b: 164) 
      } 
     } 
    } 
    var chatViewWidth: CGFloat = 200 { 
     didSet { 
      chatView.widthAnchor.constraint(equalToConstant: chatViewWidth).isActive = true 
     } 
    } 

    private var leftAlignmentConstraints: [NSLayoutConstraint] = [] 
    private var rightAlignmentConstraints: [NSLayoutConstraint] = [] 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     setupViews() 

    } 

    func setupViews() { 

     chatView = UIView() 
     chatTextView = UITextView() 
     contentView.addSubview(chatView) 
     contentView.addSubview(chatTextView) 

     chatView.translatesAutoresizingMaskIntoConstraints = false 
     chatTextView.translatesAutoresizingMaskIntoConstraints = false 

     chatView.backgroundColor = .blue 

     chatTextView.font = UIFont.systemFont(ofSize: 16) 
     chatTextView.layer.cornerRadius = 9 
     chatTextView.clipsToBounds = true 
     chatTextView.isScrollEnabled = false 

     leftAlignmentConstraints = [ 
      chatView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 10), 
      chatTextView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 15) 
     ] 

     rightAlignmentConstraints = [ 
      chatView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -10), 
      chatTextView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -15) 
     ] 

     chatView.widthAnchor.constraint(equalToConstant: chatViewWidth).isActive = true 
     chatView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true 
     chatTextView.widthAnchor.constraint(equalTo: chatView.widthAnchor, constant: -10).isActive = true 
     chatTextView.topAnchor.constraint(equalTo: chatView.topAnchor, constant: 5).isActive = true 

     NSLayoutConstraint.activate(leftAlignmentConstraints) 
    } 

    override func prepareForReuse() { 
     super.prepareForReuse() 
     chatTextView.text = "" 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

好運和快樂編碼