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

Does the constraint or its anchors reference items in different view hierarchies? That's illegal

我正在尝试以编程方式创建带有约束的 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] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with anchors and because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.'

谁能帮我解决这个问题?

您的主要问题是每次循环都在创建 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 的子视图。

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

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

不确定您的总体 totalItemsmultiplier 计算以及您的其余约束是否真的会按照您的要求进行。您可能需要重新考虑您的方法(您没有展示/解释您要做什么,所以很难说)。