约束或其锚点是不是引用不同视图层次结构中的项目?这是违法的
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(...)
语句,您将不会得到那个错误。
不确定您的整体 totalItems
和 multiplier
计算以及您的其他约束是否真的会按照您的意愿进行。你可能需要重新考虑你的方法(你没有展示/解释你的目标,所以很难说)。
【讨论】:
以上是关于约束或其锚点是不是引用不同视图层次结构中的项目?这是违法的的主要内容,如果未能解决你的问题,请参考以下文章