💡 1~3번의 방법들은 다른 ViewController에 직접적으로 의존하게 되므로 강한 결합이 되어있는 형태가 되고, 객체 간 모듈화에도 좋지 않으며 스파게티 코드가 될 위험이 있어서 남발하면 좋지 않다.
4~6번의 방법은 강한 결합 형태의 문제점을 벗어나 서로 의존하지 않는 구조로 전달할 수 있다고 하니 공부해보자!
오늘은 Delegate를 이용해 VC2 -> VC1 로 데이터 전달 하는 방법을 정리하려고 한다.
storyboard로 작업해서 VC1은 ViewController, VC2는 NextViewController로 각각 파일을 만들고 VC1 -> VC2를 Segue로 연결했다.
protocol NextViewControllerDelegate {
func sendData(data: String)
}
extension ViewController: NextViewControllerDelegate {
func sendData(data: String) {
label.text = data
}
}
var delegate: NextViewControllerDelegate?
@IBAction func goButtonPressed(_ sender: UIButton) {
guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as? NextViewController else {return}
nextVC.delegate = self
present(nextVC, animated: true, completion: nil)
}
@IBAction func doneButtonPressed(_ sender: Any) {
if let data = textField.text {
delegate?.sendData(data: data)
}
dismiss(animated: true)
}
// ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
}
// (2) 데이터를 받는 VC, SendDataDelegate 프로토콜 채택, 준수
// MARK: -NextViewControllerDelegate
extension ViewController: NextViewControllerDelegate {
func sendData(data: String) {
label.text = data
}
// (4) NextViewController에 있는 SendDataDelegate 프로토콜 타입 변수 delegate는 나다!
@IBAction func goButtonPressed(_ sender: UIButton) {
guard let nextVC = self.storyboard?.instantiateViewController(withIdentifier: "NextViewController") as? NextViewController else {return}
nextVC.delegate = self
present(nextVC, animated: true, completion: nil)
}
}
// NextViewController.swift
import UIKit
// (1) 프로토콜 생성
protocol NextViewControllerDelegate {
func sendData(data: String)
}
class NextViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
// (3) 데이터를 보내는 VC에서 SendDataDelegate 프로토콜 타입 변수 생성
var delegate: NextViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func doneButtonPressed(_ sender: Any) {
if let data = textField.text {
delegate?.sendData(data: data)
}
dismiss(animated: true)
}
}