[iOS/Swift] 화면 간 데이터 전달 - Segue

민니·2022년 7월 6일
0

iOS

목록 보기
10/22

지난 글에는 화면 전환 방법 중 하나인 Segue에 대해 포스팅했습니다!
이번 글에선 화면 간 데이터 전달에 대해 포스팅해 보겠습니닷 😀


Segue

segue의 속성들에 접근하기

✏️ source: segue의 출발 뷰 컨트롤러
✏️ destination: segue의 도착 뷰 컨트롤러


이전 화면 -> 다음 화면 데이터 전달

  • prepareForSegue:sender: 메서드를 사용하면 편리함

📚 prepareForSegue:sender: 메서드

: Notifies the view controller that a segue is about to be performed.
세그가 발생할 것을 뷰 컨트롤러에게 알림

  • 전처리 메서드
  • segue를 실행하기 직전에 시스템에 의해 자동으로 호출됨

✏️ segue를 실행하기 직전에 시스템에 의해 자동으로 호출된다? 🤔 그러면 이때 다음 화면에게 데이터를 전달하면 되지 않을까?
✏️ 다음 화면의 프로퍼티에 데이터를 전달하려면, 다음 화면의 뷰 컨트롤러에 접근할 수 있어야 함 ➡️ 타입 캐스팅을 이용하자!



📚 구현해 보자 ❗️

  1. 데이터가 전달되는지 확인하기 위해 두 번째 뷰 컨트롤러에 label을 삽입해 줌

  1. Second View Controller 에서 Outlet 생성, 프로퍼티 선언

    ✏️ label의 nameLabel outlet을 생성
    ✏️ 이전 화면에서 데이터를 받아올 프로퍼티 name 선언

  1. View Controller에서 prepare 메서드 override

    ✏️ segue.destination 을 SecondViewController로 다운 캐스팅한 후 옵셔널 바인딩해 줌
    ✏️ viewControllername에 전달하고 싶은 데이터 대입
    (다운 캐스팅을 실시하였으므로, viewController의 타입은 SecondViewController 입니닷)

4. Second View Controller의 nameLabel의 text를 name으로 변경



전환된 화면 -> 이전 화면으로 데이터 전달

  • 전환된 화면에서 이전 화면으로 데이터를 전달하기 위해서는 delegate 패턴을 이용하면 됨
  • delegate에 대한 글(https://velog.io/@vvkkiie/Swift-Protocol-Delegate)
  • 간단하게 설명하자면, 일을 위임을 하는 사람과 위임을 받는 사람이 있다고 가정! 위임을 받은 사람은 일을 대신할 수 있다.
  • 두 뷰 컨트롤러 사이의 관계로 생각해 보자면, 전환된 화면이 이전 화면으로 데이터를 전달해야 하므로 전환된 화면이 위임하는 객체, 이전 화면이 위임받는 객체라고 생각하면... 편하지 않을까 🤔

📚 구현해 보쟈 ❗️

(delegate는 그냥 예제를 통해 이해하는 게 제일 좋았던 것 같당)
이전 화면을 첫 번째 뷰 컨트롤러,
전환된 화면을 두 번째 뷰 컨트롤러라고 표시하겠습니닷


  1. 이전 화면으로 데이터를 전달한 것을 하기 위해, 이전 화면으로 버튼 구현하고 액션 생성


  1. 첫 번재 뷰 컨트롤러에서도 데이터를 받아오는지 확인 위해 label 삽입 후, outlet 만들어 줌


  1. delegate 패턴에 따라 두 번째 뷰 컨트롤러 코드 구현

✏️ protocol 선언
✏️ delegate 변수 선언(메모리 누수 방지를 위해 weak으로 선언해야 한다고 한당. 아직 잘 모르는 부분이라 더 찾아본 뒤에 기록하기)
✏️ self.delegate?.sendData(name:) : sendData를 위임하겠다고 선언


  1. 첫 번째 뷰 컨트롤러 코드 구현

    ✏️ 프로토콜 채택
    ✏️ 두 번째 뷰 컨트롤러가 시키는 일을 자신(self)가 하겠다고 선언하기 위해서는, segue.destination을 이용하여 뷰 컨트롤러 인스턴스를 가져와야 함
    ✏️ viewController.delegate = self: viewController가 시키는 일을 자신이 하겠다고 선언
    ✏️ 프로토콜 구현 - nameLabel을 받아온 데이터로 변경


+) 데이터를 서로 전달하는 코드 구현
💻 https://github.com/minnnidev/SeguePassingData

0개의 댓글