이번에는 Delegate Pattern에 대해 알아보겠습니다! :-)
Delegate
- 사전적 의미 : "위임하다"
- 다른 객체가 해야할 일을 부분적으로 대신 처리
- Ex) 사람이 TV에 달린 채널 조절 버튼을 직접 누르는 대신 위임자 역할의 리모콘을 이용하여 채널을 조절
Delegate Pattern 처리 과정 (간략히)
- StoryBoard의 ViewController에 NavigationController를 Embed In 해준다.
- SecondViewController에서 TextField에 문자열을 입력하고 버튼을 누른다.
- ViewController(첫 화면)의 Label에 방금 SecondViewController에서 입력한 문자열이 기입된다.
알아둬야할 점
- Delegate Protocol 작성 (대신 처리할 일(함수))
- Delegate 채택
- 위임자 연결
- 처리 업무 함수 작성
Delegate Protocol 작성 (대신 처리할 일)
// DelegateVC.swift
import Foundation
protocol DelegateVC {
/// 완료 버튼 클릭시 호출될 함수, 인자로 TextField에 입력된 문자열 받기
func onCompleteBtnDidTap(_ text: String)
}
Delegate 채택 & 위임자 연결 & 업무 처리 함수 작성
- 다른 객체의 할 일을 위임받아 일을 처리할 곳에서 채택한다.
- 우리는 지금 FirstVC에서 SecondVC의 일을 위임받아 처리할 것이기 때문에 ViewController.swift에서 채택한다.
- SecondVC의 Delegate 변수를 가지고 위임자를 자신(ViewController)으로 연결해준다.
// ViewController.swift
import UIKit
/// DelegateVC 채택!!!
class ViewController: UIViewController, DelegateVC {
// MARK: - Outlet
@IBOutlet weak var lblBox: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Action
@IBAction func onNextBtn(_ sender: UIButton) {
guard let controller = self.storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController else { return }
/// 화면을 넘어가면서 다음 화면에 있는 Delegate 변수를 통해 할 일을 위임 받음
/// 너가 부탁한 일 내가 해줄게!!
controller.delegateVC = self
self.navigationController?.pushViewController(controller, animated: true)
}
/// SecondViewController에서 완료 버튼을 누르면서 부탁한 일을 처리 해주는 함수
/// TextField에 입력한 Text를 ViewController의 Label에 입력해준다.
func onCompleteBtnDidTap(_ text: String) {
lblBox.text = text
}
}
Delegate 처리 함수에 인자 값 넘겨주기
- Delegate 변수를 생성하고, 그 변수로 ViewController에 있는 처리 함수에 인자를 넘겨준다.
- 우리는 TextField에 문자열을 입력하고 그 것을 인자로 넘길 것이다.
// SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
// MARK: - Property
/// Delegate 변수 생성
var delegateVC: DelegateVC?
// MARK: - Outlet
@IBOutlet weak var txtField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Action
@IBAction func onCompleteBtn(_ sender: UIButton) {
/// TextField에 값이 있다면, 할 일을 Delegate 채택한 곳에 위임해주자.
guard let text = txtField.text else { return }
self.delegateVC?.onCompleteBtnDidTap(text)
self.navigationController?.popViewController(animated: true)
}
}
Delegate Pattern 동작 영상
마치며
- 이번 포스팅에서는 Delegate Pattern의 전체적인 동작 과정을 간단하게 알아보기 위해 복잡하지 않게 다뤄보았습니다!!
- Delegate Pattern은 iOS 코딩을 하다보면 정말 자주 쓰이므로 간단하게나마 동작 과정을 꼭 알아두시면 좋을 것 같습니다. : )