728x90
화면 전환을 하는 이유는 아무래도 화면 간에 데이터를 전달하기 위함이니까 이번에는 데이터를 전달하는 방법에 대해 작성해봅니다.
1. code로 전환할 때
원래 화면 -> 다음 화면으로 데이터 전달 : 전달할 VC로 다운 캐스팅을 해준 후, 해당 VC의 프로퍼티에 값을 직접 전달
guard let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondVCViewController else { return }
secondVC.textLabel = "글자 보내기"
self.present(secondVC, animated: true, completion: nil)
// secondVC에는 textLabel이라는 문자열 프로퍼티가 선언되어 있음
다음 화면 -> 이전 화면(원래 화면)으로 데이터 전달 : 대리자(Delegate) 선언, 특정 시점에 데이터 전달 (ex. 뒤로가기 시점)
// 프로토콜 선언 (어느 위치에 선언해도 상관 없음)
protocol sendDataDelegate: AnyObject {
func sendData(data: String)
}
// ----- 전달할 화면 (다음 화면) 속에 해당 코드 구현 -----
// 1. 전달할 화면(secondVC)에 대리자 선언 ( 강한 순환 참조 방지를 위해 weak 변수 선언)
weak var delegate: sendDataDelegate?
// 2. 특정 시점에 데이터 전달
self.delegate?.sendData(data: "문자 보내기")
// ----- 원래 화면 (이전 화면) 속에 해당 코드 구현 -----
// 1. 원래 화면(이전 화면)에 sendDataDelegate 채택
class firstVC: UIViewController, sendDataDelegate {
func sendData(data: String) {
// 받은 데이터를 처리할 코드를 이곳에 구현
}
}
// 2. 원래 화면 클래스 속 Button에 전달할 화면의 Delegate를 채택
@IBAction func Button(_ sender: UIButton) {
guard let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondVC else { return }
secondVC.delegate = self
self.present(secondVC, animated: true, completion: nil)
}
2. segue로 전환할 때
원래 화면 -> 다음 화면으로 데이터 전달 : prepare 메서드로 전처리
// 원래 화면에서
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondVC = segue.destination as? SecondVC {
secondVC.textLabel = "문자 보내기"
}
}
// 다음 화면 viewDidLoad()에서
if let textLabel = textLabel {
// 데이터 처리
}
다음 화면 -> 이전 화면(원래 화면)으로 데이터 전달 : code와 마찬가지로 프로토콜과 대리자를 이용하여 데이터 전달
728x90
'Dev > iOS' 카테고리의 다른 글
[Dev, iOS] StoryBoard 없이 시작하기 (Xcode 13) (0) | 2022.01.27 |
---|---|
[Dev, iOS] Push Notification (알림 메시지) 클릭 시 특정 뷰 오픈하기 (0) | 2022.01.26 |
[Dev, iOS] Storyboard를 활용한 화면 전환 4가지 방법 (0) | 2022.01.14 |
[Dev, iOS] Swift Package Manager 사용하기 (Xcode 13) (0) | 2022.01.13 |
[Dev, iOS] Storyboard 없이 첫 화면을 구성하는 법 (0) | 2022.01.13 |