반응형
뭐 대충 이런 코드가 있다고 가정해보자
class TestViewController: UIViewController, UITextFieldDelegate
{
let textfield = TestTextField()
override func viewDidLoad() {
super.viewDidLoad()
textfield.delegate = self
view.addSubview(textfield)
textfield.backgroundColor = .blue
textfield.snp.makeConstraints
{
$0.top.equalToSuperview().offset(100)
$0.leading.equalToSuperview().offset(20)
$0.trailing.equalToSuperview().offset(-20)
}
view.backgroundColor = .white
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(end)))
}
@objc func end(sender: UIGestureRecognizer)
{
view.endEditing(true)
}
func textFieldShouldBeginEditing(_ textField: UITextField)
-> Bool
{
print("Parent")
return true
}
}
class TestTextField: UITextField, UITextFieldDelegate
{
init() {
super.init(frame: .zero)
self.delegate = self
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func textFieldShouldBeginEditing(_ textField: UITextField)
-> Bool
{
print("textField")
return true
}
}
여기서 문제
키보드가 올라갔을 때 어떤 단어가 콘솔로그에 표시가 될까?
1. Parent
2. textField
3. 둘 다 표시 된다.
4. 아무것도 표시되지 않는다.
정답은..........
정답
1, Parent 입니다
생각을 조금 해보면 간단히 알 수 있는 문제입니다.
init() {
super.init(frame: .zero)
self.delegate = self
}
TextField의 init에서 delegate를 self로 세팅을 해주는데
class TestViewController: UIViewController, UITextFieldDelegate
{
let textfield = TestTextField()
override func viewDidLoad() {
super.viewDidLoad()
textfield.delegate = self
view.addSubview(textfield)
textfield.backgroundColor = .blue
textfield.snp.makeConstraints
{
$0.top.equalToSuperview().offset(100)
$0.leading.equalToSuperview().offset(20)
$0.trailing.equalToSuperview().offset(-20)
}
view.backgroundColor = .white
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(end)))
}
@objc func end(sender: UIGestureRecognizer)
{
view.endEditing(true)
}
func textFieldShouldBeginEditing(_ textField: UITextField)
-> Bool
{
print("Parent")
return true
}
}
ViewController의 viewDidLoad에서 textField의 delegate를 self로 세팅을 한다.
ViewController의 viewDidLoad는 TextField의 init보다 늦게 호출이 되므로 textField의 delegate는 ViewController로 바뀌게 된다.
결론
Delegate를 여러 번 정의하면 어떻게 될까?
마지막에 세팅한 클래스의 함수만 불린다.
반응형
'개발 > Swift(IOS)' 카테고리의 다른 글
Clean Architecture + MVVM(ReactorKit) - 1 (1) | 2021.06.08 |
---|---|
[Swift] 클로저와 함수 그리고 값 캡쳐(Closures, functions and value capture) (0) | 2021.01.05 |