본문 바로가기
iOS_Swift 앱개발👍

[iOS_Swift] Delegate Pattern을 이용한 값 전달 _ 29

by 개발하는윤기사 2023. 1. 14.
728x90
반응형

위임하다!

 

Delegate Pattern을 통해 특정 기능을 위임하는 것이 가능합니다!

필수적으로 3가지가 필요합니다!

  1. 프로토콜 (Protocol) : 대리자가 수신자에게 전달할 내용의 약속(규칙)
  2. 수신자 (Receiver) : 대리자가 특정 기능을 수행 후 데이터를 전달받을 대상
  3. 대리자 (Delegate) : 데이터를 전달해 줄 대리자

예를 들어 BVC → AVC으로 데이터를 전달해주려고 한다면 대리자는 BVC, 수신자는 AVC이 됩니다.

그리곤 BVC에 delegate를 인스턴스화시켜 주고, 값을 넘겨주는 동작을 설정해 줍니다.

수신자인 AVC에서 BVC.delegate = self로 채택해 주면 됩니다. 그리곤 필수적으로 프로토콜에 작성되어 있는 전달할 내용을 필수적으로 작성해주어야 합니다. 

 

무슨 말인지 한 번에 이해가 잘 안 가죠? 그래서 예시를 준비했습니다!

 

🔥 왼쪽 테이블뷰에서 SearchBar를 이용해 주식명 검색 후 선택한 주식의 종목명을 오른쪽 SearchBar에 값을 전달하고 싶은 경우

왼쪽 SearchViewController, 오른쪽 BuyandSellViewController

 

1. 데이터를 전달해 줄 대리자(Delegate)데이터를 전달받을 수신자(Receiver)를 설정해 줍니다. 데이터를 전달해 주는 쪽은 왼쪽 SearchViewController가 되겠고, 데이터 전달을 받는 수신자는 BuyandSellViewController가 될 겁니다.

 

2. 데이터를 전달해 주는 대리자(Delegate)에 인스턴스화를 시켜주고, 값을 넘겨주는 동작을 설정합니다. TableView의 indexPath.row를 이용해서 해당하는 Cell의 Label에 접근합니다.

lazy var delegate: SendStockDelegate?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let stockNameData = stockList[indexPath.row].stockName
        delegate?.sendStockName(stockNameData)
        self.dismiss(animated: true)
    }

 

3. 데이터를 전달받을 수신자(Receiver)는 오른쪽 BuyandSellViewController가 되겠죠? 수신자 VC에서 대리자가 수신자에게 전달할 내용의 약속(규칙)인 Protocol(Anyobject)을 설정합니다. 저희가 필요한 것 text니까 String값을 받도록 하겠습니다.

  • Any & AnyObject의 차이
    • Any : 모든 타입을 저장할 수 있게 해 줌!
    • AnyObject : 모든 클래스 타입을 저장할 수 있게 해 줌!
public protocol SendStockDelegate: AnyObject {
    func sendStockName(_ text: String)
}

 

4. 수신자 VC에 위에 3번에서 생성했던 Protocol과 delegate=self로 채택해 줍니다. 받은 String값을 우리가 원하는 SearchBar.text에 값을 넣어주고 func을 동작시키면 전달이 완료됩니다. 

final class BuyandSellViewController: BaseViewController, SendStockDelegate, UISearchBarDelegate {
    
    func sendStockName(_ text: String) {
        mainView.contentSearchBar.text = text
    }
    
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        
        let vc = SearchViewController()
        vc.delegate = self
        transition(vc, transitionStyle: .present)
        
        dismisskeyboard()
    }
    
    func dismisskeyboard() {
        view.endEditing(true)
    }
    
}

 

 

🍎 전체 코드

//값을 보낼 SearchViewController
final class SearchViewController: BaseViewController {

lazy var delegate: SendStockDelegate?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let stockNameData = stockList[indexPath.row].stockName
        delegate?.sendStockName(stockNameData)
        self.dismiss(animated: true)
    }

//값을 받을 BuyandSellViewController
public protocol SendStockDelegate: AnyObject {
    func sendStockName(_ text: String)
}

final class BuyandSellViewController: BaseViewController, SendStockDelegate, UISearchBarDelegate {

    func sendStockName(_ text: String) {
        mainView.contentSearchBar.text = text
    }
    
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        
        let vc = SearchViewController()
        vc.delegate = self
        transition(vc, transitionStyle: .present)
        
        dismisskeyboard()
    }
    
    func dismisskeyboard() {
        view.endEditing(true)
    }
    
}

 

728x90
반응형