[UMC-iOS] delegate 패턴으로 화면 간 데이터 전달하기

9957 단어 UMCUMC

delegate 패턴 사용하여 화면 간 데이터 전달하기 😀

view controller 2개 만들어 주고,
첫 번째 화면에 label과 <다음 화면으로> 버튼 만들어 줌.
두 번째 화면에 textField와 <이전 화면으로> 버튼 만들어 줌.

첫 번째 화면에서 <다음 화면으로> 버튼을 누르면 화면이 전환되고, 두 번째 화면에서 textField에 텍스트를 입력한 뒤, <이전 화면으로> 버튼을 누를 시, 첫 번째 화면의 label이 입력된 값으로 바뀌게 만들기.
(화면 간 데이터 전달)

  • 화면 전환 개념
  • protocol
  • delegate


첫 번째 뷰컨트롤러 - viewController 클래스와 연결 두 번째 뷰컨트롤러 - SecondViewController 클래스와 연결
//ViewController.swift
import UIKit

protocol ChangeLabelDelegate {
    func doChange()
}

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    //일을 위임할 delegate 변수 - 이 delegate가 ChangeLabelDelegate를 시킬 수 있음
    var delegate : ChangeLabelDelegate?
  
    //다음 화면으로 버튼을 누르면
    @IBAction func ButtonNextVC(_ sender: UIButton) {
        //nextVC 인스턴스화 후 SecondViewController으로 다운캐스팅해줌
        guard let nextVC = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as? SecondViewController else {
            return
        }
        
        //지금 이 view controller을 nextVC(다음화면)의 이전화면으로 설정
        nextVC.previousViewController = self
        
        //다음 화면으로 넘어가기
        self.present(nextVC, animated: true, completion: nil)
    }
    
    
}
  • ChangeLabelDelegate 라는 protocol을 선언해 줌.
  • var delegate : ChangeLabelDelegate
    일을 위임할 delegate 변수를 선언해 주는 것인데, 이 delegate 변수를 사용하여, 위임받는 객체가 protocol의 기능을 사용하도록 함.
  • nextVC.previousViewController = self
    지금 이 viewController을 nextVC(다음 화면)의 이전화면으로 설정함.
import UIKit

//프로토콜 메소드를 준수해라
class SecondViewController: UIViewController, ChangeLabelDelegate {
    func doChange() {
        //이전화면에 있는 label의 텍스트에 dataTextField의 text값을 넣겠다
        previousViewController?.label.text = self.dataTextField.text
    }
    
    
    var text: String?
    var previousViewController: ViewController?
    //전 화면이 어떤 것인지 알기 위해 설정한 ViewController 타입 변수
    
    @IBOutlet weak var dataTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        //previousViewController이 시키는 일을 자신이 하겠다고 선언
        previousViewController?.delegate = self

    }
    

    //이전 화면으로 버튼을 누르면
    @IBAction func buttonDIsmiss(_ sender: UIButton) {
        doChange() //do change 함수를 호출한당
        self.dismiss(animated: true, completion: nil)
    }
    

}
  • class SecondViewController: UIViewController, ChangeLabelDelegate
    ChangeLabelDelegate라는 프토토콜을 준수해야 함. 프로토콜에 있던 메소드도 마저 작성해 주어야 한다.
    - func doChange() 작성
  • var previousViewController: ViewController?
    전 화면이 어떤 것인지 알기 위해 선언한 ViewController 타입 변수
  • previousViewController?.delegate = self
    previousViewController이 시키는 일을 자신이 하겠다고 선언함.



위임하는 쪽에선 protocol을 선언, 일을 위임하겠다는 delegate 변수를 선언해 줌.

위임받는 쪽에선 자신이 위임받겠다는 것을 표시하고 프로토콜 메소드를 완성해야 함.




<첫 번째 화면>

<두 번째 화면>

<첫 번째 화면으로 화면 복귀> - 첫 번째 화면의 label이 변경됨






Udemy - 누구나 따라할 수 있는 클론코딩

좋은 웹페이지 즐겨찾기