Custom Delegate

suojae·2023년 12월 1일
0

UIKit

목록 보기
3/6

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에 값을 전달해서 텍스트값을 할당한다
profile
Hi 👋🏻 I'm an iOS Developer who loves to read🤓

0개의 댓글