하드코딩으로 컴포넌트들을 만들고 오토레이아웃을 구성하여 UI 짜기
표면적으로는 구) 프레임 => 현) 오토레이아웃(상대적, 동적) 시스템으로 UI를 그리는 방식으로 변경
실제로는 프레임 시스템도 존재하여 내부에 구현된 것을 프레임에 직접 그리게 됨
항상 제약에서 leading 이 왼쪽인것은 아님(글자가 시작되는 방향이 leading 일뿐)
private let passwordResetButton: UIButton = {
let button = UIButton()
button.backgroundColor = .clear
button.setTitle("비밀번호 재설정", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
button.tintColor = .white
button.addTarget(self, action: #selector(resetButtonTapped), for: .touchUpInside)
return button
}()
위와 같은 코드에서
button.addTarget(self, action: #selector(resetButtonTapped), for: .touchUpInside)
부분의 self 에서 경고가 발생함
'self' refers to the method 'ViewController.self', which may be unexpected
button.addTarget(ViewController.self, action: #selector(resetButtonTapped), for: .touchUpInside)
self => ViewController.self 로 변경 권장
여기서 에러가 나는 이유는 addTarget이 self 에 접근할때는 아직 button속성이 초기화 되지 않았을때 이기 때문이다. 따라서 addTarget에서 까지 메서드가 다 완료되고 난 후에 button 이 리턴되어 그제서야 passwordResetButton 변수가 생길수 있도록(lazy하게 button 속성들이 완성된 후에 생기도록)
해야하는 것이다. (추측)
찾아보니 비슷한 에러가 있어서 그걸 기반으로 (영어..) 해석해 본 결과이다. 내가 참고한 원문은 다음 스택오버플로우 와 나의 여태까지 배운 문법..
xcode 추천 방식으로 고치면 안되고 private let 을 lazy var 로 변경해야한다.
private lazy var passwordResetButton: UIButton = {
let button = UIButton()
button.backgroundColor = .clear
button.setTitle("비밀번호 재설정", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
button.tintColor = .white
button.addTarget(self, action: #selector(resetButtonTapped), for: .touchUpInside)
return button
}()
(눌러서 확대하세요)