ios

[ios - Swift] Delegate를 사용해서 뷰에 데이터 전송하기

POKY_0908 2020. 11. 30. 18:00

 

 

 

이번 글에서는 델리게이트를 사용해서 뷰에 데이터를 전송하는 것을 목표로 코드를 작성했습니다.

 

A, B 컨트롤러를 구현 후 A 컨트롤러에서는 데이터 전송, B 컨트롤러에서는 데이터를 수신을 할 수 있도록 하겠습니다.

 

 

 

이미지와 같이 A, B 두 가지의 UIViewController와 클래스를 구현합니다.

 

뷰 구현이 끝났다면. Swift 파일을 생성 후 사용할 델리게이트 코드를 작성해 주도록 합니다.

 

import Foundation

protocol MessageDelegate : class {
    func SendMessage(pMessage: String?)
}

프로토콜이 무엇인지는 검색하면 자세히 나오니 궁금하신 분은 따로 찾아보면 됩니다.

 

 

먼저 데이터를 전송받을 B 컨트롤러를 구현하도록 할 텐데 작성한 MessageDelegate를 선언하면 아래와 같은 문구가 나오는 것을 확인할 수 있습니다. 

 

이는 프로토콜 내 함수가  해당 뷰 컨트롤러 내 구현되지 않아 나오는 것으로 Fix를 눌러서 구현하면 됩니다.

 

 

 

 

import UIKit

class BController: UIViewController, MessageDelegate {

    var ReciveText: String?
    @IBOutlet weak var mMainLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if ReciveText != nil {
            mMainLabel.text = ReciveText
        }
    }

    func SendMessage(pMessage: String?) {
        ReciveText = pMessage
    }
}

B 컨트롤러를 코드를 보면 MessageDelegate.swift 에서 작성한 SendMessage를 이용해 라벨 텍스트를 수정하도록 구현하였습니다.

 

 

A 뷰 컨트롤러에 버튼을 추가 후 코드를 작성해 보도록 하겠습니다.

 

import UIKit

class AController: UIViewController {

    weak var myDelegate: MessageDelegate?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func viewMove(_ sender: Any) {
        let controller = self.storyboard?.instantiateViewController(identifier: "BController") as! BController
        
        self.myDelegate = controller
        
        self.navigationController?.pushViewController(controller, animated: true)
        myDelegate?.SendMessage(pMessage: "메시지를 전송합니다.")
    }
}

 

self.myDelegate = controller

myDelegate의 대리자를 B컨트롤러로 설정하는 것이라고 생각하면 될 것 같습니다.

 

SendMessage는 Push 전 후 작성하더라도 사용 가능합니다.