Подтвердить что ты не робот

Получение исключения: "Невозможно настроить макет с иерархией представления, не подготовленной для ограничения"

В моем приложении раскадровки я пытаюсь добавить дополнительный 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..."
    }
}
4b9b3361

Ответ 1

Попробуйте добавить passwordTextField в свой супервизор, прежде чем связывать с ним какие-либо ограничения.


UPD (спасибо @vmeyer и @MacMark): обратите внимание, что безопаснее добавлять ограничения не в viewDidLoad или viewWillAppear/viewDidAppear, а в updateViewConstraints или viewWillLayoutSubviews, так как иерархия представлений может быть неподготовлена ​​для этой операции.

Ответ 2

Я предлагаю вам не добавлять ограничения в viewDidLoad, потому что установлена ​​иерархия представлений, но не ограничения. Вы должны предпочесть updateViewConstraints или viewWillLayoutSubviews

Ответ 3

Вы пытаетесь добавить ограничение к виду, которое не добавлено/не создано в текущей иерархии представления. Сначала добавьте представление, затем примените ограничение.