2016-09-28 6 views
0

私はUITextFieldをプログラム的に制約しようとしていますが、「共通の祖先がないために項目を使用して制約をアクティブにできません。制約がさまざまなビュー階層の項目を参照していますか?UITextFieldをプログラムで制約すると、「共通の祖先がないため制約をアクティブ化できません」というエラーが発生します。

私は制約を有効にした場所(つまりconstraint.active = true)に問題を絞りました。しかし、私はどのように問題を解決するのか分かりません。

デバッグしようとしているうちに、私は以前の行で表示するためにtextFieldサブビューを追加しても、viewDidLoad()またはviewWillAppear()がtextField.superviewを印刷してもnilを返すことがわかりました。最後に、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

あなたは、あなたがプロパティを参照する新しい、UITextField異なるそれぞれの時間を返す計算されたプロパティを作成しましたので、ごemailField宣言の最後に()を追加するのを忘れ。あなたが欲しい:

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

ありがとうございました!私はこれに数時間を費やしました... –

関連する問題