본문 바로가기
iOS랑 친해지기

[iOS] 화면전환하는 방법 (ContentViewController/ContainerViewController/present/popViewController/pushViewController/Segue)

by 데브킹덕 2022. 9. 29.

먼저 Content View Controller와 Container View Controller에 대해 보자

 

Content View Controller

- 화면을 구성하는 뷰를 직접 구현하고 관련된 이벤트를 처리하는 뷰 컨트롤러

- 콘텐츠를 담고있는 뷰컨이라고 생각하자!

 

Container View Controller

- 하나 이상의 자식뷰컨트롤러를 가짐  (Content View Controller를 가진다고 생각하면 됨)

- 하나 이상의 자식뷰컨트롤러를 관리하고 레이아웃과 화면 전환을 담당함

- 화면구성과 이벤트 관리는 자식뷰컨트롤러에서 함

- 대표적으로 Navigation Controller, TabBar Controller가 있음

- 한마디로 자식뷰컨트롤러를 모아놓은 컨테이너 담은 ViewController라고 생각하자! 

 

 

 

화면전환 방법은 크게 소스 코드로 전환할 수 있고 스토리보드로 전환 할 수 있음

자세하게는 4가지로 전환 할 수 있음

1. ViewController의 View 위에 다른View를 가져와서 바꿔치기

 바꿔치기 하면 메모리가 누수 되기 때문에 대체로 사용하면 안됨

2. ViewController에서 다른 ViewController를 호출하여 전환하기

3. NavigationController를 사용하여 화면전환하기

4. 화면 전환용 객체 세그웨이를 사용하여 전환하기

 

입맛에 맞게 골라쓰면 되지만

1번은 안쓰는게 좋으니 2번부터 알아보자

 

 

 

2. VC에서 다른 VC를 호출하여 전환하기

- present(화면 덮어쓸때), dismiss (덮은화면 제거할떄) 메서드 사용

- 기존 ViewController에서 새로운 ViewController를 덮는 Modal 방식

- present함수에 이동할 ViewController의 이름을 넣어주면 이전화면에서 이동할 화면이 표시됨

 

'어때이' present 사용예제

 

 

 

 

첫번째 파라미터 =  새로운 화면으로 이동할 ViewController이름

두번째 파라미터 =  화면전환 애니메이션 유무, Bool타입

세번째 파라미터 =  화면전환이 완료되는 시점에 맞게 completion 클로져 호출됨

화면전환방식은 비동기식으로 처리되기 떄문에 화면전환이 완료된 이후에 처리해야할 로직이 있다면 completion에 작성하면 됨

 

참고)

동기 

-요청과 결과가 동시에 일어난다는 뜻

-요청하면 시간이 얼마나 걸리든 결과가 주어져야함

비동기

- 요청과 결과가 동시에 일어나지 않음

 

 

- 첫번째 파라미터 애니메이션 유무 Bool

- 두번째 파라미터 completion 이전화면 돌아갈시 completion 클로져 호출

 

-present함수를 통해서 ViewContoller를 이동하였을때 이전화면으로  돌아가는 함수 dismiss메서드

-기존화면을 덮고 있는 화면을 걷어낸다고 생각하면 됨

- 돌아가는것이기 때문에 ViewController의 인스턴스를 인자로 받지 않음

 

 

 

 

3. NavigationController를 사용하여 화면전환하기

- pushViewController(NavigationStack에 추가)

- popViewControlelr(NavigationStack에 제거)

- 계층적인컨텐츠 구조를 관리하기 위한 컨트롤러일때 사용

- ViewController의 전환을 직접 컨트롤하고 앱에 네비게이션 정보를 표시할 뿐만아니라 네비게이션 스택으로 자식뷰 컨트롤러를 관리함

 

Navigation Controller 

- 계층구조로 구성된  내용들을 순차적으로 보여주는 Container View Controller

- 네비게이션 스택이라는 정렬된 배열을 사용하여 자식뷰컨트롤러를 관리함

- 배열의 첫번째 컨트롤러를 스택에 맨 밑에 있어서 RootViewController라고 함 

- 배열의 마지막 컨트롤러를 최상단에 있는 ViewController겠쥬?

- Navigation Controller는 Navigation Stack을 이용해서 ViewController에 화면전환을 관리함

 

다음화면은 네비게이션 스택뷰에 push,pop을 하는 예제임

 

 

 

- 네비게이션 스택은 LIFO (LastInFirstOut) 스택구조임

- 스택에 나중에 들어온것이 나중에 나가는 구조

- 스택에 점점 쌓이는 것을 push

- 상위 카테고리에서 하위카테고리로 점차 넓혀져가는 트리구조임

- Navigation Stack에서 화면을 제거할때 

- 사용자는 Back 버튼을 이용해서 최상단 ViewController를 제거할 수 있음

- 또는 Left edge swipe를 통해 제거할 수 있음

- 이것을 pop되었다고함

 

Navigation Bar

- 네비게이션 컨트롤러로 구현할때 화면상단에 항상 보여주는 바

- RootViewController 외 모든 ViewController에 Backbutton이 있어 유저가 계층구조에서 뒤로 갈 수 있게 해줌

- Navigation bar ,button item, Title, Promt로 구성되어 있음

-자식VC마다 다른 네비게이션 바를 구성 할 수 있음 

 

 

- pushVIew 네비게이션 스택에 추가

- 첫번째 파라미터 - 스택에 푸시할 뷰 컨트롤러.

  이 개체는 탭 표시줄 컨트롤러가 될 수 없습니다. 뷰 컨트롤러가 이미 탐색 스택에 있는 경우 이 메서드는 예외를 throw합니다.

- 두번째 파라미터 - 애니메이션 효과 유무 bool타입

 

 

PopView 네비게이션 스택에 제거

첫번째 파라미터  - 이전화면으로 애니메이션 효과 유무 bool타입

 

 

 

 

 

 

 

 

 

4.화면 전환용 객체 세그웨이를 사용하여 전환하기

- 세그웨이는 두개의ViewController사이에 연결된 화면 전환 객체를 의미

- 스토리보드로 출발지와 목적지를 직접 지정하는 방식

 

4-1)Manual Segueway

- 출발점이 ViewController자체인경우

- 적절한 시점에 perform 세그 메서드를 호출하면서 실행되어 화면전환이 일어남

 

4-2)Action Segueway (trigger Segueway)

 

- 출발점이 버튼, 셀 등 인경우

- 버튼 클릭처럼 액션을 취할경우 세그위이 실행과 바로 연결

- 소스코드를 추가하지 않아도 화면전환을 구성할 수 있음

Show, Show Detail, Present Modally, Present As Popover, Custom 이 있음

 

Show 

- 네비게이션 ViewController를 사용할때 화면전환시 VIewController가 NavigationStack에 쌓이게 되고 만약 NavigationViewController를 사용하지 않을경우 ViewController가 present (덮어 쓰는) 됨 

 

Show Detail

- Split VIew에서 사용되는 세그웨이

- 아이폰에서는 Show랑 같지만 아이패드에서는 나눠지는 화면으로 구성이됨

 

 Present Modally

- 이전 ViewController를 덮으면서 새로운 화면이 나타남

- presentation방식임 

 

Present As Popover

- 아이패드에서 사용됨 팝업창에서 사용됨

- 아이폰에서는 사용안함

 

Custom

- 사용자가 커스텀하고 싶을때 사용함