소개

  • 뷰 컨트롤러간 값을 전달하는 방법은 다양한데, 그 중에서 오늘은 Delegate 패턴을 이용할 것 이다.
  • VC1 에서 VC2로 이동 후, VC2에서 입력한 값을 VC1에서 가져오는 형식으로 진행된다.
  • 스토리보드는 다음과 같이 만든다.

VC1

import UIKit

class VC1: UIViewController, VC2Delegate {
    // 결과를 보여줄 Label
    @IBOutlet weak var resultLabel: UILabel!
    // VC2에서의 결과값을 저장할 변수
    var result: String = ""
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    // VC2로 이동
    @IBAction func moveButtonDidTap(_ sender: UIButton) {
        // VC2 인스턴스 생성
        let vc2 = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2
        
        // Delegate 지정
        vc2.delegate = self
        
        // VC2 띄우기
        present(vc2, animated: true, completion: nil)
    }
    
    // 결과 확인
    @IBAction func showResultButtonDidTap(_ sender: UIButton) {
        resultLabel.text = result
    }
    
    //MARK: Delegate Method
    
    func saveResult(textFieldContents: String) {
        // VC2로 부터 받은 값을 result 변수에 대입
        result = textFieldContents
    }
}

VC2

import UIKit

// 프로토콜 정의
protocol VC2Delegate {
    func saveResult(textFieldContents: String) -> Void
}

class VC2: UIViewController {
    // 입력창
    @IBOutlet weak var inputTextField: UITextField!
    
    // Delegate 선언
    var delegate: VC2Delegate?
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    // 확인 버튼
    @IBAction func doneButtonDidTap(_ sender: UIButton) {
        if let contents = self.inputTextField.text {
            
            // delegate method 실행
            delegate?.saveResult(textFieldContents: contents)
            dismiss(animated: true, completion: nil)
        }
    }
}

결과 확인

  • 동영상으로 보기
  • 단 위 코드에서는 예외처리가 안되어 있기 때문에 실제 적용시에는 예외처리를 해야합니다.