[Swift] View Controller 이동 간 데이터 전달 방법

Ryan (Geonhee) Son·2021년 5월 1일
0

Study Stack

목록 보기
11/34
post-thumbnail

화면을 이동할 때 이전 화면에서 가지고 있던 데이터를 다음 화면으로 넘겨주어야 하는 경우가 있습니다. 이럴 때는 어떤 방법을 적용할 수 있을까요?


예시 상황

TableView에서 개별 Cell을 선택했을 때 상세 화면으로 전환되는 과정에서 데이터를 넘겨주는 상황을 예시로 들어보겠습니다.

TableView를 보여주는 과정에서 TableView를 담당한 ViewController가 이미 TableView와 다음 화면인 상세 화면에서 보여주어야할 정보를 모두 가지고 있습니다 (JSON 디코딩 데이터).

그렇다면 저희가 다음 ViewController에게 알려주어야 할 정보는 아래와 같습니다.
2. 선택된 CellindexPath.row에 따라 보여주어야 할 상세 화면의 데이터 (이름, 이미지, 상세 설명)

어떤 것을 다음 ViewController에 전달해야할지 알았으니 어떻게 하는지 알아볼까요?


prepare(for:sender:) 메서드 활용

UIViewControllerprepare(for:sender:) 메서드를 활용하면 다음 화면으로 정보를 넘겨줄 수 있습니다. 아래 이미지처럼 재정의되지 않은 perpare(for:sender:) 메서드는 아무 것도 하지 않습니다.

하지만 재정의하여 사용하면 전환될 화면인 다음 ViewController에 데이터를 넘겨줄 수 있죠. 코드를 보시겠습니다.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let indexPath = tableView.indexPath(for: sender as! UITableViewCell) else {
        os_log(.fault, log: .ui, OSLogMessage.indexPathIsNil)
        return
    }
    
    if segue.identifier == Identifier.Segue.artworkDetail {
        let followingViewController = segue.destination as? ArtworkDetailViewController
        
        followingViewController?.artwork = artworks[indexPath.row]
    }
}

코드를 통해 목표한 요소를 넘겨주고 있음을 확인할 수 있습니다. 상세히 설명하면 아래와 같은 과정을 거치는 것이지요.
1. sender로부터 선택된 CellindexPath.row를 추출
2. artworks 배열의 indexPath.row 번째 인덱스에 있는 요소를 다음 ViewControllerartwork 프로퍼티로 할당

그럼 데이터를 받는 ViewController는 전달 받은 데이터를 저장할 프로퍼티를 가지고 있어야 합니다.

final class ArtworkDetailViewController: UIViewController {
    // MARK: - Properties
    var artwork: Artwork?
  
    (... 후략)
}

특정 Segue가 실행될 때 데이터를 전달하는 방법

아직 제가 재정의한 prepare(for:sender:) 메서드에서 설명되지 않은 부분이 있습니다. 코드를 계속해서 살펴보시죠.

if segue.identifier == Identifier.Segue.artworkDetail {
    let followingViewController = segue.destination as? ArtworkDetailViewController
    
    followingViewController?.artwork = artworks[indexPath.row]
}

위 조건문은 segue.identifier를 검사하여 Identifier.Segue.artworkDetail인 경우 코드 블럭 안의 내용을 실행한다고 명시하고 있습니다.

Segueidentifier를 설정하는 방법은 먼저 스토리보드에서 Segue를 만들고, Attributes InspectorStoryboard Segue 섹션의 Identifier를 작성해주시면 됩니다.

이상으로 UIViewControllerprepare(for:sender:) 메서드를 재정의하여 화면 전환 간 데이터를 전달하는 방법을 살펴보았습니다.

profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글