화면을 이동할 때 이전 화면에서 가지고 있던 데이터를 다음 화면으로 넘겨주어야 하는 경우가 있습니다. 이럴 때는 어떤 방법을 적용할 수 있을까요?
TableView
에서 개별 Cell
을 선택했을 때 상세 화면으로 전환되는 과정에서 데이터를 넘겨주는 상황을 예시로 들어보겠습니다.
TableView
를 보여주는 과정에서 TableView
를 담당한 ViewController
가 이미 TableView
와 다음 화면인 상세 화면에서 보여주어야할 정보를 모두 가지고 있습니다 (JSON 디코딩 데이터).
그렇다면 저희가 다음 ViewController
에게 알려주어야 할 정보는 아래와 같습니다.
2. 선택된 Cell
의 indexPath.row
에 따라 보여주어야 할 상세 화면의 데이터 (이름, 이미지, 상세 설명)
어떤 것을 다음 ViewController
에 전달해야할지 알았으니 어떻게 하는지 알아볼까요?
prepare(for:sender:)
메서드 활용UIViewController
의 prepare(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
로부터 선택된 Cell
의 indexPath.row
를 추출
2. artworks
배열의 indexPath.row
번째 인덱스에 있는 요소를 다음 ViewController
의 artwork
프로퍼티로 할당
그럼 데이터를 받는 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
인 경우 코드 블럭 안의 내용을 실행한다고 명시하고 있습니다.
Segue
의 identifier
를 설정하는 방법은 먼저 스토리보드에서 Segue
를 만들고, Attributes Inspector
의 Storyboard Segue
섹션의 Identifier
를 작성해주시면 됩니다.
이상으로 UIViewController
의 prepare(for:sender:)
메서드를 재정의하여 화면 전환 간 데이터를 전달하는 방법을 살펴보았습니다.