web-dev-qa-db-ja.com

例外の取得:「制約の準備ができていないビュー階層でレイアウトを設定することはできません」

ストーリーボードアプリケーションで、インターフェイスに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..."
    }
}
54
mustafa

制約をバインドする前に、スーパー変数にpasswordTextFieldを追加してみてください。


[〜#〜] upd [〜#〜](@vmeyerと@MacMarkに感謝):viewDidLoadにない制約を追加する方が安全であることに注意してくださいviewWillAppear/viewDidAppearただし、 pdateViewConstraints または viewWillLayoutSubviews にあります。これは、この操作に対してビュー階層が準備されていない可能性があるためです。

79
knuku

ビュー階層は設定されていますが、制約は設定されていないため、viewDidLoadに制約を追加しないことをお勧めします。 pdateViewConstraints または viewWillLayoutSubviews をお勧めします

11
vmeyer

現在のビュー階層で追加/作成されていない制約をビューに追加しようとしています。最初にビューを追加してから、制約を適用します。

0
GSK