Swift랑 친해지기

[iOS] Delegate를 이용해 전 ViewController로 데이터 전달(Swift)

데브킹덕 2022. 8. 29. 18:58

 

 

 

 

 

1. 새프로젝트를 만들어서 ViewController에는 Label과 button 추가

SecondViewController에는 TextField와 button 추가

Cocoa Touch Class로  SecondViewController파일 추가

identyfier inspector에서 SecondViewController

2. ViewController에 Label은 Outlet을 연결해주고, Button은 Action을 연결해줌

Touch up inside하였을 경울 SeconViewController가 fullscreen으로 창이 뜨도록 함

 

 

 

SecondViewController에 TextField는 Outlet으로 button은 present한 창을 dismiss할 수 있도록 Action으로 구현

 

3.ViewController에 프로토콜 ChangedLabeldDelegate 생성해 주고

protocol ChangedLabelDelegate{
    func doChange()
}

4.SecondViewController에서 PreviousViewController 생성

 var previousViewController :ViewController?

5.ViewController에서 버튼을 눌렀을때 previousViewController가 자신이라는것을 명시해줌

 goSecondVC.previousViewController = self

6.SecondViewController에 ChangedLabelDelegate를 위임받도록 추가

class SecondViewController: UIViewController,ChangedLabelDelegate {
}

7.previousController에 있는 textLabel의 text를 textField의 text로 바꿔줌

 previousViewController?.textLabel.text = self.textField.text

8.previousViewController에 있는 delegate가 위임받겠다고 추가

        previousViewController?.delegate = self

9.SecondViewController에 bakButton을 눌렀을때 doChage함수 호출 

@IBAction func backButton(_ sender: Any) {
        doChange()
}

    

//ViewController


import UIKit

protocol ChangedLabelDelegate{
    func doChange()
}
class ViewController: UIViewController {


    @IBOutlet weak var textLabel: UILabel!
    
    @IBAction func didTapGoSecondVC(_ sender: Any) {
        guard let goSecondVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as?  SecondViewController else {
            return
        }
        goSecondVC.previousViewController = self // previousViewController가 자신이라는 것을 알게 해줘야함
        goSecondVC.modalPresentationStyle = .fullScreen
        self.present(goSecondVC, animated: true, completion: nil)
        
    }

    var delegate : ChangedLabelDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
//SecondViewController

import UIKit

class SecondViewController: UIViewController,ChangedLabelDelegate {
    func doChange() {
        previousViewController?.textLabel.text = self.textField.text
    }//previousController에 있는 textLabel의 text를 textField의 text로 바꿔줌
    

    var previousViewController :ViewController? //전에 있던 뷰가 어떤것인지 알기 위해서
    
    override func viewDidLoad() {
        super.viewDidLoad()
        previousViewController?.delegate = self

        // Do any additional setup after loading the view.
    }
    
    @IBOutlet weak var textField: UITextField!
    @IBAction func backButton(_ sender: Any) {
        doChange()
        dismiss(animated: true, completion: nil)
        
    }
}