约束或其定位点是否引用不同视图层次结构中的项?这是非法的



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

我将Uiview Outlet作为视图,并给出了情节板中的领先,底部,落后和高度限制。现在,当我试图以编程方式限制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"而终止应用程序,原因是:'。约束或其锚定参考项目是否在不同的视图层次结构中?那是非法的。'

任何人可以帮助我解决这个问题吗?

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

下一个通过循环的时间,创建 new btnOne-然后,您将btnSecond添加到viewSingle并尝试将其限制为 new btnOne,尚未添加到viewSingle

如果您创建3个按钮vars 外部循环 - 例如相同的级别创建viewSingle,然后从循环内部删除任何= UIButton(...)语句,您将不会遇到该错误。<<<<<<<<<<<<<<<<<</p>

不确定您的总体totalItemsmultiplier计算以及其余约束是否实际上会做您想要的事情。您可能需要重新考虑自己的方法(您没有显示/解释要说的是很难说)。

最新更新