본문 바로가기
Developer/iOS, Swift

[Swift] Protocol과 delegate를 이용하여 뷰 간 데이터 전달하기

by Doony 2019. 11. 10.

지난 포스팅에서는 뷰 이동 시 데이터 전달에 있어서, 직접 스토리보드의 뷰 id로 접근하여 값을 넘기는 방법에 대해 알아보았는데요. 이번에는 프로토콜과 delegate를 이용하는 방법에 대해 알아보겠습니다.

상황은 이렇습니다. 첫번째 뷰에서 버튼 클릭 시 두번째 뷰로 넘어가고, 두번째 뷰의 레이블에 첫번째 버튼 텍스트가 입혀집니다.
두번째 뷰의 버튼을 클릭 시, 두번째 뷰는 dismiss되고, 첫번째 뷰로 두번째 뷰 버튼의 텍스트를 입힙니다.
즉, 주요는 두 뷰 간 이동 시 데이터를 전달한다는 점입니다. 지난 포스팅에서 전자에 대한 부분을 설명했기 때문에, 이번에는 dismiss시 이동 방법에 대해 알아보겠습니다.

먼저 스토리보드와, 2개의 뷰에 대한 스위프트 파일을 아래와 같이 셋팅합니다.

FirstViewController

class FirstViewController: UIViewController, MyProtocol {

    @IBOutlet var btnFirst: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func btnFirstClicked(_ sender: UIButton) {
        let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
        let vc = storyBoard.instantiateViewController(withIdentifier: "secondVC") as! SecondViewController 
        vc.dataReceived = btnFirst.currentTitle 
        vc.delegate = self
        self.present(vc, animated: true, completion: nil)

    }

    func protocolData(dataSent: String) {
        btnSecond.setTitle(dataSent, for: .normal)
    }
}

SecondViewController.swift


protocol ProtocolData {
    func protocolData(dataSent: String)
}
class FirstViewController: UIViewController, MyProtocol {

    @IBOutlet var btnSecond: UIButton!
    @IBOutlet var lblSecond: UILabel!
    var dataReceived: String = ""
    var delegate: ProtocolData?

    override func viewDidLoad() {
        super.viewDidLoad()
        lblSecond.text = dataReceived
    }

    @IBAction func btnSecondClicked(_ sender: UIButton) {

        self.delegate?.protocolData(dataSent: btnSecond.currentTitle)
        self.dismiss(animated: true, completion: nil)

    }

}
  • 데이터를 보낼 쪽에서 프로토콜을 선언하고, delegate를 선언합니다.
  • 받는 쪽에서 해당 프로토콜을 상속하면, 프로토콜 메소드를 필수로 갖게 되어있습니다. 해당 메소드를 통해 두번째 뷰로부터 데이터를 받을 수 있습니다.

댓글