본문 바로가기

개발/Swift(IOS)

[실험실-1] Delegate를 여러 번 정의하면 어떻게 될까?

반응형

뭐 대충 이런 코드가 있다고 가정해보자

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를 여러 번 정의하면 어떻게 될까?

마지막에 세팅한 클래스의 함수만 불린다.

반응형