ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS [Swift] - Delegate Pattern (델리게이트 패턴)
    iOS Develop 2022. 3. 9. 18:58
    반응형
    이번에는 Delegate Pattern에 대해 알아보겠습니다! :-)

     


     

    Delegate

     

    • 사전적 의미 : "위임하다"
    • 다른 객체가 해야할 일을 부분적으로 대신 처리
    • Ex) 사람이 TV에 달린 채널 조절 버튼을 직접 누르는 대신 위임자 역할의 리모콘을 이용하여 채널을 조절

     

     

    Delegate Pattern 처리 과정 (간략히)
    1. StoryBoard의 ViewController에 NavigationController를 Embed In 해준다.
    2. SecondViewController에서 TextField에 문자열을 입력하고 버튼을 누른다.
    3. 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 코딩을 하다보면 정말 자주 쓰이므로 간단하게나마 동작 과정을 꼭 알아두시면 좋을 것 같습니다. : )
Designed by Tistory.