2017-12-17 50 views
0

遅延ビューでインスタンス化されたテキストフィールドをプログラムで追加するときは、イニシャライザで削除するとクラッシュし、viewDidLoad()で削除するとテキストフィールドは表示されません。遅延ビューのインスタンス化されたUIビューでサブビューを2回追加する必要があります

class VC: UIViewController { 
    override func viewDidLoad() { 
     view.addSubview(textField) 
     view.setNeedsUpdatedConstraints) 
    } 

    lazy var textField: UITextField! = { 
     let field = UITextField() 
     field.translatesAutoresizingMaskIntoConstraints = false 

     view.addSubview(field) 

     field.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     field.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
     field.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true 
     field.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.1).isActive = true 

     return field 
    }() 
} 

viewDidLoad()view.addSubview(textField)を削除すると、エラーが発生するが、何も現れません。初期化プログラムのview.addSubview(field)を削除すると、次のエラーでクラッシュします。Unable to activate constraint with anchors <NSLayoutXAxisAnchor:0x600000469380 "UITextField:0x7fc931023600.centerX"> and <NSLayoutXAxisAnchor:0x600000469480 "UIView:0x7fc92f60c690.centerX"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.

両方の呼び出しが必要な理由は何ですか?これは問題を引き起こしますか?これを行う良い方法は何でしょうか?ありがとう。

+0

'textField'はどこに宣言されていますか? – rmaddy

+0

この例の変数名を変更するのを忘れてしまった、whoops –

+0

イニシャライザで削除したときのエラーは何ですか?あなたの質問(コメントではない)にエラーを入れてください。 – rmaddy

答えて

0

制約のために、textFieldイニシャライザでテキストフィールドをサブビューとして追加する必要があります。ビューが追加されるまで、制約を設定することはできません。

viewDidLoadにテキストフィールドを追加する必要があるようです。レイジーイニシャライザが呼び出されないためです。実際にaddSubview(textField)に電話する必要はありません。イニシャライザを起動するには、textFieldへの参照が必要です。

無関係ですが、textFieldが暗黙的にアンラップされていると宣言される理由はありません。