我正在尝试以编程方式约束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
}
答案 0 :(得分:1)
您忘记将()
添加到emailField
声明的末尾,因此您创建了一个计算属性,每次引用该属性时都会返回一个新的,不同的UITextField
。你想要:
var emailField: UITextField {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
return textField
}()