나는 여태까지 Segue를 이용하여 뷰컨간 데이터를 전달할때 VC1->VC2 인 경우에만 사용했었다. 가끔 VC2->VC1 으로 데이터를 전달해야 할 때는 Notification
이나 Delegate
를 사용했다. 그런데 APPS 스터디에서 강의를 들으면서 VC2->VC1으로 데이터를 전달하는 방법을 알게 되었다!!
그래서 Segue를 통해 데이터를 VC2->VC1로 전달하는 방법을 적어보려한다.
스토리 보드에 다음과 같이 뷰컨을 구성해준다.
첫번째 뷰컨(FirstVC)에서 버튼을 눌러 두번째 뷰컨(SecondVC)으로 넘어간 후, SecondVC의 textfield에 내용을 입력하고 뒤로가기 버튼을 누르면 FirstVC의 라벨에 글자가 나타난다.
@IBOutlet weak var dataLabel: UILabel! // 두번째 뷰컨에서 받아 올 데이터를 표시하는 라벨
만들어준 버튼을 클릭해서 Control을 누른채로 SecondVC로 드래그한다. 그리고 show를 눌러 두 뷰컨을 segue로 연결한다.
FirstVC
타입의 변수를 선언한다.var firstVC: FirstVC?
@IBOutlet weak var textfield: UITextField!
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let nextVC = segue.destination as? SecondVC {
nextVC.firstVC = self
}
}
prepare메소드
는 세그로 인한 화면전환이 일어나기 직전에 호출되는 메서드다. segue.destination
은 segue의 목적지 뷰컨을 나타낸다.화면이 전환되는 뷰컨은 nextVC이라고 정해준 후 이 뷰컨이 SecondVC 타입이라면, nextVC안의 firstVC이라는 프로퍼티를 자신의뷰컨(FirstVC)이라고 설정한다.
(글쓰면서 느끼는 것은.. 프로퍼티 이름을 굉장히 헷갈리게 했네..)
이 부분을 prepare메서드 안에 써주었기 때문에 버튼을 눌러 화면이 전환되기 직전에,
다음화면의 특정 프로퍼티가 현재 뷰컨(화면전환 되기 전 뷰컨)이 될 수 있는 것!
override func viewWillDisappear(_ animated: Bool) {
firstVC?.dataLabel.text = textfield.text
}
viewWillDisappear
: ViewController의 생명주기에서, 뷰컨이 사라지기 직전에 호출되는 메서드이다.3번에서 firstVC가 화면전환되기 이전VC(nextVC.firstVC = self)라고 명시해줬다. 따라서 현재 뷰(SecondVC)가 사라지기 전, firstVC의 dataLabel에 접근해 현재뷰컨의 textfield안의 내용을 넘겨준다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let nextVC = segue.destination as? SecondVC {
nextVC.firstVC = self
}
}
다음 뷰컨의 프로퍼티에 현재 뷰컨타입의 프로퍼티를 선언해주면, 화면전환 되기 전에 그 프로퍼티에 현재 뷰컨을 할당해줄 수도 있구나..
그러면 다음 뷰컨에서 다시 첫 뷰컨에 접근하기가 쉬워지겠구나.
실습코드
https://github.com/hyesuuou/APPS-Swift/tree/main/Week04/SegueDataSend