web-dev-qa-db-fra.com

Obtention d'une exception: "Impossible de configurer la mise en page avec une hiérarchie de vues non préparée à la contrainte"

Dans mon application de storyboard, j'essaie d'ajouter UITextField supplémentaire à l'interface. Mais je reçois l'exception que dit le titre. J'utilise SwiftAutoLayout bibliothèque. Voici mon code:

// 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

Essayez d'ajouter passwordTextField à sa vue d'ensemble avant de lui associer des contraintes.


[~ # ~] upd [~ # ~] (merci @vmeyer et @MacMark): veuillez noter qu'il est plus sûr d'ajouter des contraintes qui ne sont pas dans viewDidLoad ou viewWillAppear/viewDidAppear mais dans pdateViewConstraints ou viewWillLayoutSubviews car la hiérarchie des vues peut ne pas être préparée pour cette opération.

79
knuku

Je vous suggère de ne pas ajouter de contraintes dans viewDidLoad, car la hiérarchie des vues est définie, mais pas les contraintes. Vous devriez préférer pdateViewConstraints ou viewWillLayoutSubviews

11
vmeyer

Vous essayez d'ajouter une contrainte à la vue qui n'est pas ajoutée/créée dans la hiérarchie de vues actuelle. Ajoutez d'abord la vue, puis appliquez la contrainte.

0
GSK