iOS - ViewController간 데이터 전달방법 (Delegate)

이한솔·2023년 8월 19일
0

iOS 앱개발 🍏

목록 보기
8/49

ViewController 간 데이터를 주고받는 방법

  1. 직접 프로퍼티에 접근
  2. 함수를 통한 접근
  3. Segue
  4. Delegate
  5. Closure
  6. NotificationCenter

💡 1~3번의 방법들은 다른 ViewController에 직접적으로 의존하게 되므로 강한 결합이 되어있는 형태가 되고, 객체 간 모듈화에도 좋지 않으며 스파게티 코드가 될 위험이 있어서 남발하면 좋지 않다.
4~6번의 방법은 강한 결합 형태의 문제점을 벗어나 서로 의존하지 않는 구조로 전달할 수 있다고 하니 공부해보자!



Delegate

오늘은 Delegate를 이용해 VC2 -> VC1 로 데이터 전달 하는 방법을 정리하려고 한다.

storyboard로 작업해서 VC1은 ViewController, VC2는 NextViewController로 각각 파일을 만들고 VC1 -> VC2를 Segue로 연결했다.

  1. 프로토콜을 생성한다.
protocol NextViewControllerDelegate {
    func sendData(data: String)
    
}
  1. 데이터를 받을 VC1에서 프로토콜을 채택하고 함수를 생성한다.
extension ViewController: NextViewControllerDelegate {

    func sendData(data: String) {
        label.text = data
    }
    
 }
  1. VC2에서 NextViewControllerDelegate 프로토콜 타입의 변수를 생성한다.
var delegate: NextViewControllerDelegate?
  1. VC1 goButton IBAction에서 VC2의 변수 delegate는 self로 선언하고 push로 다음화면을 띄워준다.
  @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)
        
  }
  1. VC2 DoneButton의 IBAction 함수에서 delegate변수를 이용해서 sendData 함수에 인자로 textField의 text를 전달하고 함수를 실행, 화면을 pop한다.
   @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)
    }
    
}

0개의 댓글