我正在尝试通过约束以编程方式创建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>
不确定您的总体totalItems
和multiplier
计算以及其余约束是否实际上会做您想要的事情。您可能需要重新考虑自己的方法(您没有显示/解释要说的是很难说)。