以编程方式约束UITextField会导致错误“无法激活约束,因为它们没有共同的祖先。”

时间:2016-09-28 01:50:12

标签: ios swift

我正在尝试以编程方式约束UITextField但仍然收到错误,“无法激活项目约束,因为它们没有共同的祖先。约束是否引用不同视图层次结构中的项目?”。

我已将问题缩小到我激活约束的位置(即constraint.active = true)。但是,我不知道如何解决问题。

在尝试调试时,我发现在viewDidLoad()或viewWillAppear()中打印出textField.superview报告为零,即使我将textField子视图添加到之前的行中进行查看。最后,如果我只是使用CGRect初始化textField,它可以很好地工作。只是不能添加约束。

这些让我很难过。

class SignInController: UIViewController {

var emailField: UITextField {
    let textField = UITextField()
    textField.translatesAutoresizingMaskIntoConstraints = false

    return textField
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.addSubview(emailField)

    setupEmailField()

    print(view)   //Returns <UIView: 0x7f93f6076510; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x7f93f607a8d0>>
    print(emailField.superview)   //Returns nil

}

// Breaks at this function
func setupEmailField() {

    emailField.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 50).active = true
    emailField.rightAnchor.constraintEqualToAnchor(view.rightAnchor, constant: -10).active = true
    emailField.leftAnchor.constraintEqualToAnchor(view.leftAnchor, constant: 10).active = true
    emailField.heightAnchor.constraintEqualToAnchor(view.heightAnchor, multiplier: 0.05).active = true

}

1 个答案:

答案 0 :(得分:1)

您忘记将()添加到emailField声明的末尾,因此您创建了一个计算属性,每次引用该属性时都会返回一个新的,不同的UITextField。你想要:

var emailField: UITextField {
    let textField = UITextField()
    textField.translatesAutoresizingMaskIntoConstraints = false
    return textField
}()