🦜 Swift

[iOS] 전역변수, 클래스간 데이터 전달 - 3

ji-hyun 2023. 5. 14. 10:29

1. 전역변수 설정 및 참조

AppDelegate 에 다음과 같은 globalData 와 같은 전역변수가 있다고 하자.

이를 다른 화면에서 출력해보겠다.

 

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    // 전역변수 선언하는 부분 - 변수, 배열, 딕셔너리, 구조체, 클래스
    var globalData: String = ""

 

 

 

 

 

뷰 컨트롤러 쪽이다.

AppDelegate 를 참조하는 방법은 다음과 같이 꼭 써줘야 한다. (이게 룰이다)

 

import UIKit

class NvMainViewController: UIViewController {
    // 전역변수를 참조하는 방법
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

 

 

 

 

 

첫번째 뷰 컨트롤러

 

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 전역변수를 참조하는 곳
        appDelegate.globalData = "전역변수 설정함"
    }

 

viewDidLoad 부분에서 이렇게 appDelegate 의 globalData 를 참조하는 것이 가능해진다.

이걸 두번째 화면으로 넘어갈 때 출력해보겠다. (지금은 첫번째 화면임)

 

 

 

두번째 뷰 컨트롤러

 

class NvViewController2: UIViewController {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    override func viewDidLoad() {
        super.viewDidLoad()

        // 전역변수를 참조하여 출력함
        print(appDelegate.globalData)
 
    }

 

똑같이 AppDelegate 를 먼저 참조시킨 뒤 viewDidLoad 부분에서 위와 같이 호출하면 

"전역변수 설정함" 이 출력된다.

 

 

 

 

 

 

 

 

 

 

 

2. 클래스간 데이터 전달 (코드로 전달)

클래스 A > B 로 이동할 때 데이터를 어떻게 전달할까?

먼저 클래스 B 를 다음과 같이 secondData 라고 변수를 선언해주자. 클래스 A 는 secondData 변수에 데이터를 할당하여 클래스 B 에게 전달해줄 것이다.

 

 

클래스 B

 

class NvViewController2: UIViewController {
    var secondData: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        // 클래스 A에서 전달받은 데이터 출력
        print(self.secondData)
    }

 

 

 

 

 

 

클래스 A 

 

 // 네비게이션 컨트롤러에서 코드로 이동하기
    @IBAction func onBtnNext(_ sender: UIButton) {
        let NewVC = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") as! NvViewController2
        NewVC.secondData = "클래스 A에서 전달한 데이터"
        self.navigationController?.pushViewController(NewVC, animated: true)
    }

 

위와 같이 이동할 때의 NewVC (클래스 B) 에다가 secondData 변수에 "클래스 A에서 전달한 데이터" 를 할당하면

클래스 B 로 이동할 때 출력된다.

 

 

 

 

 

 

 

 

 

 

3. 클래스간 데이터 전달 (Segue 로 전달)

 

 

메인화면에서 Segue 로 이동하기 버튼을 누르면 다음 화면으로 이동할 때 데이터를 전달한다고 하자.

여기서 화면 사이 경로 화살표를 클릭해주어야 한다.

그리고 오른쪽 보면 Storyboard Segue 라고 되어 있는 부분에 identifier 를 설정해주고 저장해준다.

 

 

 

 

그리고 위의 Segue 로 이동하기 버튼에다가 다음과 같이 써주자.

 

   // 네비게이션 컨트롤러에서 Segue 로 이동하기
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toSecondVC" { 
            let vc = segue.destination as! NvViewController2
            vc.secondData = "메인화면에서 전달한 데이터(segue 방식)"
        }
    }

 

 

 

 

 

그럼 두번째 화면에서는 "메인화면에서 전달한 데이터(segue 방식)" 이 출력된다.

 

class NvViewController2: UIViewController {
    var secondData: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        // 클래스 A에서 전달받은 데이터 출력
        print(self.secondData)
    }

 

 

 

 

 

 

 

 

4. 클래스 B > A 이동할 때 데이터 전달

 

AppDelegate 에다가 다음과 같이 viewController 를 선언해주자. (A 뷰 컨트롤러에 해당)

 

class AppDelegate: UIResponder, UIApplicationDelegate {
    var mainVC: NvMainViewController? = nil // 처음엔 nil 처리

 

 

 

 

 

 

A 뷰 컨트롤러에다가 mainData 를 다음과 같이 선언해준다.

 

class NvMainViewController: UIViewController {
    // 전역변수를 참조하는 방법
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    var mainData : String = ""


     override func viewDidLoad() {
        super.viewDidLoad()
        appDelegate.mainVC = self
    }

    override func viewWillAppear(_ animated: Bool) {
        print(self.mainData) // viewWillAppear 에다가 써주면 화면이 나타날 때마다 호출됨
    }

 

이때 AppDelegate 를 참조하여 mainVC 에다가 자신을 참조시켜야 한다!

 

 

 

 

 

 

클래스 B 에서는 뒤로 갈 때 appDelegate 의 mainVC 를 참조시켜 여기서 데이터를 할당할 수 있다.

그럼 뒤로 가기 버튼을 누르면 "두번째화면에서 전달한 데이터" 가 출력될 것이다.

 

    @IBAction func onBtnBack(_ sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
        appDelegate.mainVC?.mainData = "두번째화면에서 전달한 데이터"
    }