我在故事板编辑器的UILabel
中添加UIViewController
(amountLabel)。然后在swift文件viewDidLoad
中,我以编程方式创建UITextField
(paymentTextField)并尝试在amountLabel
和paymentTextField
之间添加约束。这是viewDidload
中的代码:
let paymentTextField = UITextField()
paymentTextField.translatesAutoresizingMaskIntoConstraints = false
paymentTextField.frame = CGRectMake(15, 100, CGRectGetWidth(self.view.frame) - 30, 44)
self.view.addSubview(paymentTextField)
let bottonConstraint = NSLayoutConstraint(item: paymentTextField, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.amountLabel , attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 30)
bottonConstraint.identifier = "paymentTextFieldSpacing"
NSLayoutConstraint.activateConstraints([bottonConstraint])
但是我收到了一个错误:
"由于未捕获的异常终止应用程序' NSGenericException', 原因:'无法使用项目激活约束>和>因为他们没有共同的祖先。 约束是否引用不同视图层次结构中的项目? 这是非法的。"
有谁知道出了什么问题? amountLabel
直接拖到故事板中的视图和" paymentTextField"以编程方式添加到同一视图。为什么他们没有共同的祖先?
答案 0 :(得分:109)
我遇到了你之前描述的同样的问题。为了制作程序化子视图(在您的情况下为paymentTextField),您必须先将其添加到子视图中,然后应用约束。
首先将子视图添加到视图中,这样可确保两个视图具有相同的父视图。
很晚,但希望这可以帮助其他人。
答案 1 :(得分:16)
此问题的清单:
答案 2 :(得分:10)
错误表明"因为他们没有共同的祖先",这意味着他们不会共享同一个父母。为了将两个项目之间的约束联系起来,它们必须具有子父关系或兄弟关系。
在您的情况下,只需确保它们在以编程方式添加约束之前具有相同的父视图。
答案 3 :(得分:3)
确保已将paymentTextField
添加到视图:
paymentTextField.translatesAutoResizingMaskIntoConstraints = false
view.addSubview(paymentTextField)
...
添加约束,例如paymentTextField.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
答案 4 :(得分:1)
let nameLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
如果您忘记设置此label.translatesAutoresizingMaskIntoConstraints = false
或者如果您在约束之后添加子视图
这个问题出现了