获得例外:“无法设置具有视图层次结构的布局,无法用于约束”

时间:2014-10-13 21:33:56

标签: ios swift autolayout

在我的storyboard应用程序中,我尝试向界面添加额外的UITextField。但我得到标题所说的例外。我使用SwiftAutoLayout库。这是我的代码:

// MARK: - IBOutlets

@IBOutlet weak var passwordTextField: UITextField!

// MARK: - Properties

let userIdTextField = UITextField()

// MARK: - Lifecycle

override func viewDidLoad() {
    super.viewDidLoad()

    self.passwordTextField.keyboardType = .NumberPad

    if getCurrentUserId() == nil {
        self.view.addSubview(userIdTextField)
        userIdTextField.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.view.addConstraints([userIdTextField.al_leading == passwordTextField.al_leading,
            userIdTextField.al_trailing == passwordTextField.al_trailing,
            userIdTextField.al_top == passwordTextField.al_bottom + 8])
        userIdTextField.placeholder = "Enter User Id..."
    }
}

4 个答案:

答案 0 :(得分:78)

尝试在绑定任何约束之前将passwordTextField添加到其超级视图中。


UPD (感谢@vmeyer和@MacMark):请注意,添加不在viewDidLoadviewWillAppear / {{1}的约束更安全但是在updateViewConstraintsviewWillLayoutSubviews中,因为视图层次结构可能没有为此操作做好准备。

答案 1 :(得分:11)

我建议您不要在viewDidLoad中添加约束,因为视图层次结构已设置,但不是约束。 您应该更喜欢updateViewConstraintsviewWillLayoutSubviews

答案 2 :(得分:1)

您试图添加约束以在当前视图层次结构中未添加/创建的视图。首先添加视图,然后应用约束。

答案 3 :(得分:0)

在为超级视图中的视图添加约束之前,请先将该视图添加到超级视图中。

superView?.addSubview(view) superView?.addConstraints([topConstraint,leftConstraint,bottomConstraint,rightConstraint])