2016-09-28 3 views
0

Я пытаюсь программно ограничить UITextField, но продолжаю получать ошибку: «Невозможно активировать ограничение с помощью элементов, потому что у них нет общего предка. Связаны ли ссылочные позиции ограничений в разных иерархиях представлений?».Ограничение UITextField программно приводит к ошибке «Невозможно активировать ограничение, потому что у них нет общего предка».

Я сузил проблему до того, где я активирую свое ограничение (т. Е. Constraint.active = true). Однако я не знаю, как исправить эту проблему.

При попытке отладки я обнаружил, что распечатывание textField.superview в моем представленииDidLoad() или viewWillAppear() сообщает о нуле, хотя я добавляю subview textField для просмотра в строке раньше. Наконец, если я просто инициализирую textField с помощью CGRect, он отлично работает. Просто не могу добавить противопоказания.

Это меня очень сильно озадачило.

class SignInController: UIViewController { 

var emailField: UITextField { 
    let textField = UITextField() 
    textField.translatesAutoresizingMaskIntoConstraints = false 

    return textField 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    view.addSubview(emailField) 

    setupEmailField() 

    print(view) //Returns <UIView: 0x7f93f6076510; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x7f93f607a8d0>> 
    print(emailField.superview) //Returns nil 

} 

// Breaks at this function 
func setupEmailField() { 

    emailField.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 50).active = true 
    emailField.rightAnchor.constraintEqualToAnchor(view.rightAnchor, constant: -10).active = true 
    emailField.leftAnchor.constraintEqualToAnchor(view.leftAnchor, constant: 10).active = true 
    emailField.heightAnchor.constraintEqualToAnchor(view.heightAnchor, multiplier: 0.05).active = true 

} 

ответ

1

Вы забыли добавить () к концу вашей emailField декларации, так что вы создали вычисляемое свойство, которое возвращает новый, разные UITextField каждый раз, когда вы ссылаетесь на имущество. Вы хотите:

var emailField: UITextField { 
    let textField = UITextField() 
    textField.translatesAutoresizingMaskIntoConstraints = false 
    return textField 
}() 
+0

Большое вам спасибо! Я потратил несколько часов на это ... –

Смежные вопросы