UICollectionViewCell 没有共同祖先错误(不重复)

Posted

技术标签:

【中文标题】UICollectionViewCell 没有共同祖先错误(不重复)【英文标题】:UICollectionViewCell no common ancestor error (NOT duplicate) 【发布时间】:2017-08-30 18:47:32 【问题描述】:
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")

(为了澄清,我在 ViewController 的 cellForRow 方法中设置了 chatViewWidth 和 chatTextView.text 属性)

所以现在,XCode 给出的错误如下:“无法使用锚激活约束,因为它们没有共同的祖先。约束或其锚是否引用不同视图层次结构中的项目?”

我浏览了很多关于 *** 上常见祖先错误的帖子,但没有一个解决方案能解决我的问题。

这很令人困惑。 我尝试使用断点来分析出了什么问题,但程序在创建大约 14 个左右的单元格后崩溃了。有时它可以工作,但是当我添加更多单元格时,它会开始崩溃。我不确定问题出在哪里——我的视图肯定是 CollectionViewCell 的子视图,对吗?

谢谢!

【问题讨论】:

您在 prepareForReuse 中重新创建视图,但没有将新视图添加为子视图。 1.您将约束设置为 self 而不是 chatView 中的超级视图。意味着您将它们添加到单元格的 contentView 中。 2. LayoutSubviews 被调用很多次,如果我没有错的话,你为什么不在 setupViews 上设置约束呢? 3. LayoutSubviews 没有调用 super.layoutSubviews,这样会带来一些问题。尝试在 layoutSubviews 中打印,如果我没有错,它应该会出现很多次 如果你想使用prepareForReuse,建议清除模型的内容,而不是删除它们。在此之后,您再次调用 setupViews 并设置约束。当您设置“isTextFromCurrentUser”时,您可以在属性上调用 didSet 方法并更改约束。 哦,如果我没记错的话,您需要在不再需要这些约束时删除旧约束。 嗯.. 所以我尝试了 cmets 中的所有内容。 @CleverError 您的解决方案不会引发错误,但会弄乱单元格之间的间距。 【参考方案1】:

这就是我的做法......好吧,我将在 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")
    

祝你好运,编码愉快

【讨论】:

以上是关于UICollectionViewCell 没有共同祖先错误(不重复)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UICollectionViewCell 没有从 UICollectionViewController 获取数据?

uicollectionviewcell 没有被选中

属性文本 UILabel 在 UICollectionViewCell 中被切断,但在 UITableViewCell 中没有

我的自定义 UICollectionViewCell 中的图像没有扩展到单元格的整个边界?

UIActivityIndi​​catorView 没有在 UICollectionViewCell 中旋转

使用带有情节提要的 AutoLayout 的 UICollectionViewCell 的可变宽度和高度(没有 XIB)