Toy Project/One Piece (iOS)

6. 데이터 넘기기: ViewController간의 데이터를 넘기는 방법

개발자킹콩 2021. 1. 31. 03:24

정확하게는 Segueway 로 연결된 두 ViewController 간의 전환 시, 데이터 넘기는 방법

 

 

우선 DetailView 구조를 만들어보자.

 

 

 


 

 

 

이제 데이터를 받게 되었을 때를 셋팅하면 다음과 같다.

 

 

 

 

그럼 이제는 BountyViewController에서 name과 bounty에 해당하는 데이터를 DetailViewController에 던져주면 된다. 그럼 그것은 변수 name, bounty에 받으면 끝나는 작업이다.

 

 


 

 

어떻게 던지는가..??

 

Segueway를 수행하는데는 perform이 사용된다.

Segueway를 수행하기 전 준비하는 단계에서 호출되는 함수가 있다: prepare(준비하다)

 

 

 

IndexPath는 row와 section으로 보낼 수 있는데 우리는 단일 섹션 이기에 row 로 보내면 몇번째 Cell 이 선택 되었는지를 알 수 잇다.

 

 

 


 

 

 

 

 

 

 

내가 생각한 코드리뷰

 

여기서 지켜봐야할 점은 perform에서 데이터를 보냈는데 DetailViewController에서는 sender를 받는 부분이 없다. 그리고 이 sender는 ViewController 간의 전환 시 perform 수행 전 호출되는 prepare 함수에서 받게된다.

 

코드를 해석해보면 우선 segue way의 id를 체크한다.

(이 말은 밑에 여러 if 문으로 id마다, Cell마다 다른 segue way를 만들 수 있음을 의미한다.)

 

showDetail이 맞다면 기존의 segue의 목적지를 DetailViewController로 type casting한다. 될지 안될지 모르는 상황이기에 optional casting을 하게된다.

그렇게 되면 현재 vc는 DetailViewController 클래스가 된다.

이렇게 되면 우리는 현재 이 안에서 DetailViewController의 변수와 BountyViewController의 변수 모두에 접근을 할 수 있게 된 것이다.

물론 DetailViewController의 변수는 제한적으로 접근될 수 있다.

 

여기서 perform에서 보낸 데이터인 sender를 Int 형으로 Down casting을 하면 

index는 현재 TableView의 Cell이 몇번째인지 정보를 담고 있기 때문에, index는 눌린 데이터의 번째를 의미한다.

그렇기에 DetailViewController의 객체 vc는 변수 name와 bounty의 값을 현재 index번째에 맞는 데이터로 초기화를 하게된다.

 

현재 prepare의 코드를 모두 수행하게 되면 perform함수를 호출하여 ViewController간의 segueway 전환을 하게된다.

 

 

 

다음 코드를 통해 segue way 간의 전환된 ViewController이 메모리에 Load되었다면 name의 값은 변경되어져 있음을 확인할 수 있다.