Custom Delegate
- 커스텀 델리게이트 패턴은 프로토콜을 통해서 구현한다
- 델리게이트 패턴을 프로토콜로 구현해야 하는 이유는 다음과 같다
a. 요구사항 정의 (필수 메서드)
b. 프로토콜을 통한 다형성 구현
c. 프로토콜 채택 후 선택사항 메서드 구현 가능
d. 타입 안정성 확보
e. 여러번 상속 가능으로 인한 재사용성 증가
f. 캡슐화 및 추상화
코드 구현
Protocol 선언
import UIKit
protocol ComposeDelegate {
func composer(_ vc: UIViewController, didInput value: String?)
func composerDidCancel(_ vc: UIViewController)
}
ComposeViewController
import UIKit
class ComposeViewController: UIViewController {
var delegate: ComposeDelegate?
@IBOutlet weak var inputField: UITextField!
@IBAction func performCancel(_ sender: Any) {
delegate?.compserDidCancel(self)
dismiss(animated: true, completion: nil)
}
@IBAction func performDone(_ sender: Any) {
delegate?.composer(self, didInput: inputField.text)
dismiss(animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 13.0, *) {
isModelInPresentation = true
}
}
}
CustomDelegateViewController
import UIKit
class CustomDelegateViewController: UIViewController {
@IBOutlet weak var valueLabel: UILabel!
@objc func presentComposeVC() {
performSegue(withIdentifier: "ComposeSegue", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination.children.first as? ComposeViewController {
vc.delegate = self
}
}
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add,
target: self, action: #selector(presentComposeVC))
}
}
extension CustomDelegateViewController: ComposeDelegate {
func composer(_ vc: UIViewController, didInput value: String?) {
valueLabel.text = value
}
func composerDidCancel(_ vc: UIViewController) {
valueLabel.text = "Cancel"
}
}
- 델리게이트는 보통 옵셔널로 선언한다(부탁하지 않을 때도 있기 때문에)
- 컴포즈 뷰컨트롤러에서 텍스트 필드에 스트링값을 입력하면 커스텀 델리게이트 뷰컨트롤러의 라벨에 입력받은 스트링값이 할당되는 구조이다
- 프로토콜을 통해
ComposeViewController
가 입력값을 didInput
의 파라미터로 받아 CustomViewDelegateController
에 값을 전달해서 텍스트값을 할당한다