2017-12-17 24 views
0

프로그래밍 방식으로 인스턴스화 된 텍스트 필드를 내 viewcontroller에 추가 할 때 을 두 번, 텍스트 뷰를 초기화 할 때 및 viewDidLoad()을 호출 할 때만 작동하도록했습니다. 이니셜 라이저에서 하나를 제거하면 충돌이 발생하고 viewDidLoad()에서 제거하면 텍스트 필드가 나타나지 않습니다.느린 인스턴스화 된 UI보기를 사용하여 컨트롤러를 두 번보기 위해 하위 뷰를 추가해야 함

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이 암시 적으로 언 래핑 된 것으로 선언 될 이유는 없습니다.