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 = "두번째화면에서 전달한 데이터"
}
'🦜 Swift' 카테고리의 다른 글
[iOS] Tab Bar Controller 생성 - 4 (0) | 2023.05.21 |
---|---|
[iOS] 뷰 컨트롤러의 수명 주기, 팝업창 띄우기 - 2 (0) | 2023.05.13 |
[iOS] Navigation Controller 공부 기록 - 1 (0) | 2023.05.13 |
[TIL] UIView, UIViewController, Delegate (0) | 2023.05.05 |
[iOS] weak var (0) | 2023.05.04 |