约束或其锚点是不是引用不同视图层次结构中的项目?这是违法的

Posted

技术标签:

【中文标题】约束或其锚点是不是引用不同视图层次结构中的项目?这是违法的【英文标题】:Does the constraint or its anchors reference items in different view hierarchies? That's illegal约束或其锚点是否引用不同视图层次结构中的项目?这是违法的 【发布时间】:2017-12-06 13:55:10 【问题描述】:

我正在尝试使用约束以编程方式创建 UIButton。它应该根据数组中的项目创建按钮。

我已将 UIView 插座作为 viewSingle 并在情节提要中给出了前导、底部、尾随和高度约束。现在,当我试图以编程方式约束 UIButton 时,它给出了下面提到的错误。

for (index,item) in (self.planModel.plan_settings?.sticky_buttons?.enumerated())!

        var btnOne = UIButton()
        var btnSecond = UIButton()
        var btnThird = UIButton()

        let totalItems = self.planModel.plan_settings?.sticky_buttons?.count ?? 1

        let multiplier = (UIScreen.main.bounds.width / CGFloat(totalItems)) / UIScreen.main.bounds.width
        switch index 
        case 0:
            btnOne = UIButton(type: UIButtonType.system)
            btnOne.backgroundColor = UIColor.green
            viewSingle.addSubview(btnOne)

            btnOne.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                btnOne.leadingAnchor.constraint(equalTo: viewSingle.leadingAnchor, constant: 0),
                btnOne.topAnchor.constraint(equalTo: viewSingle.topAnchor, constant: 0),
                // button.widthAnchor.constraint(equalTo: viewSingle!.widthAnchor, constant: 0),
                btnOne.heightAnchor.constraint(equalTo: viewSingle!.heightAnchor, constant: 0),
                btnOne.widthAnchor.constraint(equalTo: viewSingle.widthAnchor, multiplier: multiplier, constant: 0)
                ])
            self.view.layoutIfNeeded()
        case 1:
            btnSecond = UIButton(type: UIButtonType.system)
            btnSecond.backgroundColor = UIColor.yellow
            viewSingle.addSubview(btnSecond)

            btnSecond.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                btnSecond.leadingAnchor.constraint(equalTo: btnOne.leadingAnchor, constant: 0),
                btnSecond.topAnchor.constraint(equalTo: viewSingle.topAnchor, constant: 0),
                // button.widthAnchor.constraint(equalTo: viewSingle!.widthAnchor, constant: 0),
                btnSecond.heightAnchor.constraint(equalTo: viewSingle!.heightAnchor, constant: 0),
                btnSecond.widthAnchor.constraint(equalTo: viewSingle.widthAnchor, multiplier: multiplier, constant: 0)
                ])
            self.view.layoutIfNeeded()

        case 2:
            btnThird = UIButton(type: UIButtonType.system)
            btnThird.backgroundColor = UIColor.orange
            viewSingle.addSubview(btnThird)

            btnThird.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                btnThird.leadingAnchor.constraint(equalTo: viewSingle.leadingAnchor, constant: 0),
                btnThird.topAnchor.constraint(equalTo: viewSingle.topAnchor, constant: 0),
                // button.widthAnchor.constraint(equalTo: viewSingle!.widthAnchor, constant: 0),
                btnThird.heightAnchor.constraint(equalTo: viewSingle!.heightAnchor, constant: 0),
                btnThird.widthAnchor.constraint(equalTo: viewSingle.widthAnchor, multiplier: multiplier, constant: 0)
                ])
            self.view.layoutIfNeeded()
        default:
            break
        


    

错误:-

2017-12-06 19:16:03.601661+0530 WayOL[8637:3028327] *** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法使用锚激活约束,因为它们没有共同的祖先.约束或其锚点是否引用不同视图层次结构中的项目?这是非法的。'

谁能帮我解决这个问题?

【问题讨论】:

我不确定你想用你的代码做什么,你可能没有展示它,但我没有看到你在哪里添加任何子视图。 很难弄清楚你想要做什么......你的目标是向viewSingle添加1、2或3个按钮,宽度相等吗? 【参考方案1】:

您的主要问题是每次循环都在创建 NEW 按钮:

for (index,item) in (self.planModel.plan_settings?.sticky_buttons?.enumerated())!

        var btnOne = UIButton()
        var btnSecond = UIButton()
        var btnThird = UIButton()

        // rest of code inside loop

所以,第一次循环时,index 等于 0,然后您将 btnOne 添加为 viewSingle 的子视图。

下一次循环,你创建一个btnOne——然后你将btnSecond添加到viewSingle并尝试将其限制为 new btnOne,该 btnOne 尚未添加到 viewSingle

如果您在循环之外创建 3 个按钮变量 - 例如在您创建 viewSingle 的同一级别,然后从循环内部删除任何 = UIButton(...) 语句,您将不会得到那个错误。

不确定您的整体 totalItemsmultiplier 计算以及您的其他约束是否真的会按照您的意愿进行。你可能需要重新考虑你的方法(你没有展示/解释你的目标,所以很难说)。

【讨论】:

以上是关于约束或其锚点是不是引用不同视图层次结构中的项目?这是违法的的主要内容,如果未能解决你的问题,请参考以下文章

无法激活约束

视图层次结构没有为约束做好准备?

视图层次结构未准备好

为啥 Xcode 模拟器视图与视图层次结构视图不同

为编程视图层次结构设置自动布局约束?

Swift,约束,视图层次结构没有为约束做好准备