[iOS] Delegate 에 대하여

ohtt-iOS·2021년 8월 28일
1

iOS

목록 보기
16/24
post-thumbnail
post-custom-banner

개린이가 쓴 글이므로 오류가 있을 수 있음을 미리 알려드립니다 🐹 (꾸벅)


💡

iOS 개발을 처음 접했을 당시 이 Delegate는 저에게 너무 혼란스러운 존재였습니다.
그리고 많은 분들이 이 개념에 대해서 헷갈려하신다고 생각합니다.

그래서 제가 이해한만큼 최대한 이해하기 쉽게 글을 작성해보려고 합니다 !
누군가에게 도움이 되길 바라며 ... 시작해볼게요 !


🥕 Delegate 나에겐 너무 어려운 너


많은 분들이 Delegate를 처음 접하게 되는건 아마 `UITableViewDelegate` 이 아닐까 싶습니다
tableView.delegate = self 

많은 강의에서 하라는대로 위의 코드를 치고,
UITableViewDelegate 채택하고 ... 따라하다보면 어찌저찌 테이블 뷰 완성 ~ ~

하지만 이 UITableViewDelegate란 무엇일까 ? Delegate란 무엇인가 ...
검색해보면 대리자 위임자... 대신해준다 ... 이렇게 얘기하지만 직관적으로 와닿지 않았습니다.
그래서 약간의 비유를 들어서 설명해볼까 합니다 !



🔘 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 프로토콜을 채택한 후 메소드를 구현해주면 됩니다 :)



📺 영상으로 확인하기



🧐 어렵다 어려워

처음엔 너무 어렵지만 사용하다보면 더 잘 와닿게 되는 영역이라고 생각합니다 : )



참고자료

마기님 블로그

profile
오뜨 삽질 🔨 블로그
post-custom-banner

0개의 댓글