Swift以编程方式添加约束

jim*_*ard 32 iphone ios swift

我在storyboard编辑器中添加了UILabel(amountLabel)UIViewController.然后在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])
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

"由于未捕获的异常'NSGenericException'终止应用程序,原因:'无法激活带有项的约束>和>因为它们没有共同的祖先.约束是否引用不同视图层次结构中的项目?这是非法的."

有谁知道什么是错的?amountLabel直接拖到故事板中的视图,并以编程方式将"paymentTextField"添加到同一视图.为什么他们没有共同的祖先?

Jam*_*mil 120

我遇到了你之前描述的同样的问题.为了制作程序化子视图(在您的情况下为paymentTextField),您必须先将其添加到子视图中,然后应用约束.

通过首先添加子视图来查看,这可以确保两个视图具有相同的父视图.

很晚,但希望这可以帮助其他人.

  • 我可以验证一下。当我尝试激活约束但忘记将子视图添加到超级视图时,这发生在我身上。 (3认同)
  • @JamilNawaz是的,这也解决了我的错误。谢谢。 (2认同)

Mil*_*lya 18

这个问题的清单:

  • 检查在激活约束之前是否将以编程方式创建的视图添加到其父级
  • 检查是否在viewDidLoad()/ viewWillAppear()中编写约束激活码.您应该在updateViewConstraints或viewWillLayoutSubviews中编写约束激活代码 .(由vmeyer建议)
  • 检查是否关闭translatesAutoresizingMaskIntoConstraints.


Pau*_*uls 11

该错误表明"因为它们没有共同的祖先",这意味着它们不共享同一个父级.为了关联两个项目之间的约束,它们必须具有子父关系或兄弟关系.

在您的情况下,只需确保它们具有相同的父视图,然后以编程方式添加约束.


小智 5

确保已将添加paymentTextField到视图:

paymentTextField.translatesAutoResizingMaskIntoConstraints = false
view.addSubview(paymentTextField)

...
Run Code Online (Sandbox Code Playgroud)

添加约束,例如 paymentTextField.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true