개린이가 쓴 글이므로 오류가 있을 수 있음을 미리 알려드립니다 🐹 (꾸벅)
iOS 개발을 처음 접했을 당시 이 Delegate는 저에게 너무 혼란스러운 존재였습니다.
그리고 많은 분들이 이 개념에 대해서 헷갈려하신다고 생각합니다.
그래서 제가 이해한만큼 최대한 이해하기 쉽게 글을 작성해보려고 합니다 !
누군가에게 도움이 되길 바라며 ... 시작해볼게요 !
tableView.delegate = self
많은 강의에서 하라는대로 위의 코드를 치고,
UITableViewDelegate
채택하고 ... 따라하다보면 어찌저찌 테이블 뷰 완성 ~ ~
하지만 이 UITableViewDelegate
란 무엇일까 ? Delegate
란 무엇인가 ...
검색해보면 대리자 위임자... 대신해준다 ... 이렇게 얘기하지만 직관적으로 와닿지 않았습니다.
그래서 약간의 비유를 들어서 설명해볼까 합니다 !
저는 이 비유가 가장 와닿아서 이걸 예시로 들어보겠습니다 ㅎㅎ
Delegate를 리모콘
이라고 생각해봅시다 ! tv 리모콘, 에어컨 리모콘 뭐든 좋습니다 !
리모콘의 버튼을 누르면 리모콘이 아닌 TV / 에어컨이 작동합니다.
이것과 유사하게 동작하다고 보면 됩니다 !
예시를 통해 좀 더 자세히 알아볼까요 ?
정말 간단한 화면 구성입니다 !
첫번째 화면 상단에 Label이 있고 로그인 버튼이 있습니다.
Login 버튼을 누르면 오른쪽 화면이 나타나고 NIckname을 입력하고 SAVE 를 누르면
두번째 화면이 닫히면서 첫번째 화면의 상단 라벨에 "Welcome (닉네임) !" 이 뜨게 해보려고 합니다.
이를 구현하는 방법은 여러가지가 있지만 오늘은 Delegate로 구현해보도록 하겠습니다 😊
편한 설명을 위해 앞으로 왼쪽 화면을 A / 오른쪽 화면을 B라고 두겠습니다 ㅎㅎ
우선 어떤 애가 리모콘을 들고 있어야 할까요 ? 네 맞습니다 ! B가 들고있어야겠죠 ?
B가 Save라는 버튼을 눌렀을 때 왼쪽 화면이 변화해야합니다. 그럼 리모콘(Delegate)
을 만들어봅시다.
protocol LoginDelegate: class {
func setNickName(nickName: String?)
}
저는 로그인 리모콘(Delegate)
에 setNickName이라는 버튼을 만들어주었습니다.
class LoginViewController: UIViewController {
@IBOutlet weak var nicknameTextField: UITextField!
weak var delegate: LoginDelegate? // 리모콘 !
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func saveButtonTap(_ sender: Any) {
delegate?.setNickName(nickName: nicknameTextField.text)
// 리모콘에 있는 setNickName 버튼 누른다 !
dismiss(animated: true, completion: nil)
}
}
그리고 LoginViewController가 이 리모콘을 들고 있게 해주었습니다 ! ( 프로토콘 프로퍼티 )
그리고 나서 saveButton이 눌릴 때 이 리모콘의 setNickName버튼이 눌리도록 해주었습니다.
class ViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func loginButtonTap(_ sender: Any) {
guard let vc = self.storyboard?.instantiateViewController(identifier: "LoginViewController") as? LoginViewController else { return }
vc.delegate = self // 이 리모콘의 응답자는 나야나 ~ 나야나 !
present(vc, animated: true, completion: nil)
}
}
extension ViewController: LoginDelegate {
// 리모콘의 setNickName 버튼이 눌렸다 !?
func setNickName(nickName: String?) {
guard let nickName = nickName else { return }
titleLabel.text = "Welcome \(nickName) !"
}
}
리모콘에 반응할 ViewController를 자기자신으로 설정해줍니다.
그리고 그 버튼이 눌렸을 때 어떻게 작동할지를 LoginDelegate 프로토콜을 채택한 후 메소드를 구현해주면 됩니다 :)
처음엔 너무 어렵지만 사용하다보면 더 잘 와닿게 되는 영역이라고 생각합니다 : )