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

mus*_*afa 54 ios autolayout swift

在我的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..."
    }
}
Run Code Online (Sandbox Code Playgroud)

knu*_*uku 79

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


UPD(感谢@vmeyer和@MacMark):请注意,它的安全不加限制viewDidLoadviewWillAppear/ viewDidAppearupdateViewConstraintsviewWillLayoutSubviews因为视图层次结构可能是准备好执行这项操作.

  • 我有类似的崩溃,但视图是在代码中创建的.事实上,我在添加视图之前添加了约束.如果您的视图已经在故事板中,您可以直接在那里添加约束吗? (5认同)

vme*_*yer 11

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

  • 这个答案很好,因为在didLoad中添加约束或者/ DidAppear会因为视图层次结构没有准备而导致应用程序崩溃. (6认同)

Aak*_*pta 5

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

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