BOID

[iOS] 데이터 직접 전달하는 방식(내비게이션, 세그웨이 이용) - HoonIOS 본문

IOS 시작기

[iOS] 데이터 직접 전달하는 방식(내비게이션, 세그웨이 이용) - HoonIOS

HoonIOS 2021. 4. 4. 19:04
728x90

안녕하세요 HoonIOS입니다. :)

저번에는 프레젠테이션 방법을 이용해서 값을 전달하는 방법에 대해 알아봤습니다.

boidevelop.tistory.com/34

 

[iOS] 데이터 직접 전달하는 방식 (동기방식) -HoonIOS

안녕하세요 HoonIOS입니다 .:) 안녕하세요 저번 포스팅에는 데이터를 주고받는 방법인 동기 방식, 비동기 방식에 대해 알아봤습니다. https://boidevelop.tistory.com/33 [iOS] 다른 뷰컨트롤러와 데이터 주고

boidevelop.tistory.com

혹시 안 읽어보셨으면 읽고 오시면 좋을 거 같아요 이어지는 부분도 있거든요!!!

 

내비게이션 컨트롤러의 값을 전달하는 방식은 앞 포스팅에서 이야기한 프레젠테이션 방법과 같습니다. 단지 다른점은 화면을 전환하는 메소드만 다른 방식입니다.

 

내비게이션 컨트롤러의 값 전달 구현하기

- 앞 포스팅한 내용을 활용해보겠습니다.

( 다시 만들고 그러면 귀찮고 다들 싫어하실 거잖아요 ㅎㅎㅎㅎ )

- 내비게이션 컨트롤러로 만들어야 하기때문에 VC1에 내비게이션 뷰 컨트롤러를 임베디드 인을 시키겠습니다.

- 내비게이션 바를 좀 꾸며 보겠습니다. 내비게이션 아이템을 추가해서 타이틀을 설정으로 설정해주고 프레젠테이션 썻던 Done 버튼을 이제 내비게이션 바에 올려서 바 버튼 아이템을 추가해보겠습니다.

* 어라? 그냥 Done 버튼을 사용하면 안되나요?
- 이렇게 생각하실수 있지만 애플의 UI 지침은 내비게이션 바를 사용할 경우 액션 처리 버튼은 내비게이션 바에 배치하는게 좋다고 나와있습니다.

 

 

- 원래 전에 쓰던 Done 메소드 버튼을 끊었고 바 버튼으로 추가를 해주었으니 액션메소드를 재연결을 해보겠습니다.

아... 아... Done메소드를 이미 정의해 주었으니 다시 연결을 해주겠습니다.

- 위 영상을 보시면은 아울렛 변수나 아울렛 메소드는 만약 연결이 안 되어 있으면 원 아이콘이 비어있는 상태로 표시되어 있는 게 보이실 겁니다.

 * 다시 연결을 하는 방법은 그냥 원버튼을 클릭해서 스토리보드 객체로 드래그를 하던가 아니면 스토리보드 객체에서 메소드로 드래그해주면 다시 연결을 할 수 있습니다.

 

- 화면 전환 방법을 내비게이션 전환 방법으로 변경하겠습니다.

- 전환 방법은 엄청 간단합니다.

내비게이션 컨트롤러는 스택형이므로. present방법으로 했던 방법을. pushViewController(_:animated)로 구현을 해주면 됩니다.

 

- 어때요 전환 방법만 빼고 똑같죠?

 

- 이제는 전달이 잘 되는지 한번 확인을 해보겠습니다.

 

내비게이션 컨트롤러는 저번 프레젠테이션 방식의 값 전환과 큰 차이가 없다는 것을 알 수 있습니다.

 

뭐 이 정도 예시는 뭐 간단하죠 ㅎㅎ?

세그웨이를 이용하여 값 전달 구현하기

- 세그웨이 종류에는 매뉴얼 세그웨이랑 액션 세그웨이가 있는데 어느 세그웨이든 값을 전달하는 방식은 동일합니다.

 

내비게이션으로 했던 프로젝트를 매뉴얼 세그웨이로 다시 구현해보겠습니다.

 

세그웨이 구현해보기

- 우선 VC1에서 VC2로 세그웨이 연결을 해줍니다. 여기서 내비게이션 컨트롤러가 사용되었으니 Show 타입으로 생성해줍니다.

 

 

- 화면 전환 포스팅에서 말씀을 드렸지만 매뉴얼 세그웨이는 액션 세그웨이라 달리 소스코드로 직접 호출해서 전환을 해야 합니다

- 직접 호출하기 위해 무슨 세그웨이 인가 identifier을 설정해 줍니다.

( 여기서는 ManualData로 설정해 줍니다. )

 

- 이제는 세그웨이 기능을 구현해야겠습니다. 새 버튼을 추가하기보다는 앞 실습에서 사용했던 내비게이션 바 버튼을 새로운 메소드로 생성해서 다시 연결해 보겠습니다.

- 그전에 우선 내비게이션 바 버튼에 연결해 놓은 메소드를 끊어야 합니다.

- 바 버튼을 클릭하고 커낵션 인스펙터에 있는 메소드 연결 정보에 x 아이콘을 클릭하여 삭제를 합니다.

( 여기서 메소드가 사라지는 게 아니고 연결이 끊어지는 것입니다. 절. 대 헷갈리지 마세요! )

 

- 그다음 순서로 바 버튼의 아울렛 메소드를 생성해줍니다. 메소드 이름은 segueData로 할게요 :)

- 해당 메소드안에 매뉴얼 세그웨이를 실행시켜주는 performSegue메소드를 구현해줍니다.

* 매뉴얼 세그웨이 식별자를 설정해준것을 withidentifer에 써주면 되는데여기서 대소문자도 구분하므로 오타에 주의하시기 바랍니다! 

이제 화면 전환을 위한 세팅은 모두 끝났습니다. 그러나 아직 모든 게 끝난 게 아니죠? 값 전달을 안 했습니다.

 

값 전달을 구현해줄 때 제일 중요한 것은 무엇일까요?

  • 제일 중요한것은 구현해주는 위치입니다.
  • 값을 전달하기 위한 제일 좋은 위치는 전처리 메소드입니다. 그 이유는 전처리 메소드는 세그웨이를 실행하기 직전에 실행이 되고 필요한 것만 작성만 해두면 시스템에 의해서 자동으로 호출이 되기 때문입니다.
  • 매뉴얼, 액션 세그웨이 구분이 없이 둘 다 값 전달할 때 전처리 메소드에서 구현해주면 됩니다.

혹시 전처리 메소드를 처음 들어보셨거나 헷갈리네.... 이러시면 제가 포스팅한 여기를 들어가서 읽어보고 오시는걸 매. 우. 추. 천. 드. 립. 니. 다.

 

 

- 세그웨이는 앞 내비게이션, 프레젠테이션 방법과 달리 값을 전달할 뷰 컨트롤러의 인스턴스를 직접 생성하지 않습니다.

- 그 이유는 세그웨이의 목적지로 연결된 인스턴스는 세그웨이에 의해 자동으로 생성이 되기 때문입니다.

- 이제 전처리 메소드를 이용하여 인스턴스를 가져오고 값도 전달하도록 구현을 해보겠습니다.

 

- 차례대로 위의 전처리 메소드 코드들을 설명해보겠습니다.

  1. segue.destination을 통하여 세그웨이의 목적지 뷰 컨트롤러 인스턴스를 가져옵니다. segue는 세그웨이 객체를 의미합니다.
  2. vc2 변수에 목적지 뷰 컨트롤러의 인스턴스를 넣습니다. 여기서 단지 화면을 이동하는게 아니라 해당 뷰컨트롤러의 프로퍼티(변수)도 가져오기 때문에 ViewController2로 다운 캐스팅을 했습니다.
  3. 이제 vc2의 변수를 이용하여 각 값 객체들의 값을 넣어줍니다.

 

 이제 구현이 모두 끝났습니다 결과를 한번 봐볼까요?

 

어떤가요? 세그웨이로 구현해도 내비게이션으로 구현한 것처럼 부드럽게 잘 진행되는 것을 볼 수 있습니다 :) 뿌듯하네요

 

이번 포스팅은 매뉴얼 세그웨이를 이용했지만 액션 세그웨이로 구현을 하려고 해도 똑같이 prepare전처리 메소드를 사용하면 됩니다.

 

긴 글 읽어주셔서 감사합니다 :)

 

엄청 기네요 이제 다음으로 이전 화면으로 값을 전달하는 방법 즉 거꾸로 값을 전달하는 법을 포스팅하겠습니당~

 

 

반응형
Comments