1. 뷰 컨트롤러간 직접 전달
코드상에서 뷰 컨트롤러간 직접 데이터를 주고 받을 때에는 화면 전환 메소드에 캐스팅만 추가하면 된다. 스토리보드를 통한 화면 전환이 이루어질 경우 prepare 메소드를 통해 데이터를 전달한다. 화면 전환을 전제로 하는 이유는 화면 전환 없이 데이터만 전달하는 경우는 보통 무의미하기 때문이다. (전달한 데이터 혹은 전달받은 데이터를 사용하지 않으므로)
1-1. 코드상으로 화면 전환을 하는 경우
@IBAction func send(_ sender: UIButton) {
guard let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "VC2") as? VC2 else { return }
//데이터 전달
//뷰 인스턴스 띄우기(present or push)
}
앞서 말했듯 화면 전환 메소드와 동일하지만 as? VC2 구문이 추가되었다.
VC2로 캐스팅하는 이유는 instantiateViewController 를 통해 생성된 인스턴스는 UIViewController 이기 때문에 VC2.swift에 정의된 프로퍼티에 접근할 수 없기 때문이다.
그렇기 때문에 UIViewController를 상속받은 VC2로의 다운캐스팅을 통해 VC2가 가진 프로퍼티에 접근하여 데이터를 전달해야 한다.
1-2. 스토리보드상으로 화면 전환을 하는 경우
스토리보드상으로 화면 전환을 하는 경우 세그웨이를 이용한다.
세그웨이가 실행되기전 항상 실행되는 prepare 메소드를 통해 데이터를 전달할 수 있다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let vc2 = segue.destination as? VC2 else { return }
//데이터 전달
}
위의 prepare 메소드는 실행 시점을 우리가 정해주지 않아도 된다.
작성만 되어있다면 세그웨이 실행과 함께 자동으로 실행된다.
2. UserDefaults를 이용한 전달
UserDefaults에 데이터 저장
@IBAction func send(_ sender: UIButton) {
UserDefaults.standard.set(<Value>, forKey: <String>)
}
UserDefaults에서 데이터 가져오기
UserDefaults.standard.value(forKey: <String>)
데이터를 가져올때는 저장된 값의 타입에 맞는 메소드를 사용하면 바로 사용이 가능하다.