개발 알다가도 모르겠네요

Delegate를 간단하게 알아보자. 본문

모바일/Swift

Delegate를 간단하게 알아보자.

이재빵 2021. 1. 13. 00:14
728x90

Delegate란 어떤 객체에서 일어나는 모든 일을 하나의 객체가 처리하지 않고 일부를 다른 객체에게 위임해 처리하는 것

 

 

 UITextFieldDelegate를 예로 들겠습니다.

class StudyViewController: UIViewController , UITextFieldDelegate  {

    @IBOutlet weak var writingTextField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        writingTextField.delegate = self
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        writingTextField.endEditing(true)
        print(searchTextField.text!)
        return true
    }
}

 

여기 StudyViewController가 있습니다. 우리는 textfield의 작성이 끝나면 키보드를 내리고 출력하는 것을 구현하려 합니다.

이때 우리는 delegate를 사용해야 합니다.

 

그 이유는 애플에서 만든 UITextField 클래스에는 우리가 만든 StudyViewController 내부에 대한 정보가 전혀 없기 때문입니다. 

그야 당연합니다!  애플이 우리가 만든  StudyViewController라는 클래스를 예측하고, '키보드를 내리고 입력 내용을 출력하라는 메서드'를  미리 만들었을 리는 없으니까요. 

let writingVC = WritingViewController()

writingVC.textFieldShouldReturn(. //. // )  이런 게 선언되어 있을 리가 없죠ㅎㅎ

 

따라서 우리는 UITextFieldDelegate를 사용하려고 합니다.

writeTextField.delegate = self  

self (WritingViewController)가 textfield의 위임자가 되었습니다. 

 

 

UITextField 내부에는 

var delegate: UITextFieldDelegate()

delegate.textFieldShouldReturn(. //. // )  

이런 게 있겠죠. 이젠 아까와 달리 WritingViewController(위임자)에 대한 정보가 생겼습니다. 

 

현재

Sender : 일을 시키는 객체  - textfield

Reciever: 일을 하는 객체 - vewcontroller

protocol: 해야 할 일의 목록 - UITextFieldDelegate           이렇게 되겠죠.

 

이제 textfield 대신에 viewcontroller가 일을 대신하게 됩니다. 

이벤트가 생기면 viewcontroller는 프로토콜에 따라 textfield에게 응답을 주게 됩니다.  

 

참고로 delegate는 프로토콜 타입입니다.

그리고 UITextFieldDelegate에는 텍스트 필드에서 유저가 리턴키를 눌렀는지 판별하는 textFieldShouldReturn라는 메서드를 이용해

'키보드를 내리고 입력 내용을 출력하라는 메서드'를 구현했습니다.