화면전환1(뷰를 이용한 화면전환, present)

DEVJUN·2022년 7월 18일
0

iOS 면접 준비

목록 보기
4/6
post-thumbnail

iOS앱에서 화면을 전환하는 방법에는 크게 두가지가 있다. 코드를 이용하여 화면을 전환하는 방법과 스토리보드가 제공하는 기능을 이용하여 전환하는 방법이다.

보통 전자를 프로그래밍적으로 화면을 전환한다, 또는 동적으로 화면을 전환한다고 하고, 후자를 GUI 방식으로 화면을 전환한다, 또는 정적으로 화면을 전환한다고 한다.

동적인 방식은 특정 상황에 대응할 수 있지만 조금 복잡하고 어려운 반면, 정적인 방식은 일괄적으로 적용되는 것이라 특정상황에 대응하기는 어렵지만 구현이 쉽다.

iOS에서 화면 전환 방식은 크게 4가지로 나누어 볼 수 있다.

  1. 뷰 컨트롤러의 뷰 위에 다른 뷰를 가져와 바꿔치기하기
  2. 뷰 컨트롤러에서 다른 뷰 컨트롤러를 호출하여 화면 전환하기
  3. 네비게이션 컨트롤러를 사용하여 화면 전환하기
  4. 화면 전환용 객체 세그웨이(segueway)를 사용하여 화면 전환하기

여기서 1번은 특수한 상황에서 제한적으로 사용하는 방식이다. 1을 제외한 나머지 대부분의 화면 전환은 모두 뷰 컨트롤러를 호출하는 방식으로 이루어진다.

1. 뷰를 이용한 화면 전환

뷰를 이용한 화면전환은 하나의 뷰 컨트롤러 안에 두 개의 루트 뷰를 준비한 후, 상태에 따라 뷰를 적절히 교체해 주는 것이다. iOS에서는 하나의 뷰 컨트롤러 아래에 하나의 루트 뷰를 관리하는 MVC패턴을 기본으로 하는데, 이 방법은 이 구조를 아에 거스르는 방식이기 때문에 좋지 않다.

또 다른 방식으로는 뷰를 이용하여 화면을 전환하면서도 하나의 뷰 컨트롤러가 하나의 루트 뷰만 관리하게 할 수 있는 방법도 있다.

그러나 이 방법 역시 뷰 컨트롤러 내부에 있어야 할 뷰가 다른 뷰 컨트롤러로 옮겨가 버리므로 뷰를 제어할 책임을 지는 컨트롤러가 모호해지는 단점이 있다. 쉽게 이야기하면 다른 뷰 컨트롤러에 있는 뷰만 가져다가 끼우는 경우이다.

따라서 뷰를 이용한 화면 전환은 지양하는 것이 좋다.

2. 뷰 컨트롤러 직접 호출에 의한 화면 전환

두 번째 방법은 현재의 뷰 컨트롤러에서 이동할 대상 뷰 컨트롤러를 직접 호출해서 화면을 표시하는 방식이다. 프레젠테이션 방식이라고 부르기도 한다.

화면을 표시하는 모든 뷰 컨트롤러는 UIViewController 클래스를 상속받는데, 이 클래스에서 정의된 다음 메소드를 사용하면 화면을 전환할 수 있다.

present(<새로운 뷰컨트롤러 인스턴스>, animated:<애니메이션 여부>)

프레젠트 메소드를 이용한 화면전환은 기존의 뷰 컨트롤러를 그대로 둔 채, 그 위에 새로운 뷰 컨트로러의 화면을 덮는 방식이다.

위 이미지는 뷰 컨트롤러에서 프레젠테이션 방식으로 화면을 이동할 때 양쪽 뷰 컨트롤러 사이에서 발생하는 참조 관계를 표현하고 있다.

기존 뷰 컨트롤러인 VC1에서는 presentedViewController 속성에 자신이 표시하고 있는 새로운 뷰 컨트롤러의 포인터를 저장하고 새로운 뷰 컨트롤러인 VC2에서는 presentingViewController 속성에 자신을 표시한 뷰 컨트롤러의 포인터를 저장한다. 즉 VC1에서는 presentedViewController를 통해 VC2를 참조하고 VC2에서는 presentingViewController 속성을 이용하여 VC1을 참조할 수 있다는 뜻이다.

화면 전환후 이전화면으로 돌아갈 일이 생기는 경우가 있다. 이때 사용하는 메소드는 dismiss(animated:) 메소드이다.

iOS에서 화면이 사라지게 처리하는 것은 사라질 화면의 뷰 컨트롤러 자신이 아니라 자신을 띄우고 있는 이전 뷰 컨트롤러이다❗️

이 내용을 실험해보면🧑🏻‍💻...

우선 두개의 뷰 컨트롤러를 생성하여 다음과 같이 label과 버튼을 둔후 첫번째 화면의 뷰 컨트롤러명은 ViewController로, 두번째 화면의 뷰 컨트롤러명은 SecondViewController로 설정한다. 그리고 두 번째 뷰 컨트롤러를 참조하기 위해 인스펙터 탭을 열고 Identity 영역에서 StoryboardID 항목을 찾아 'SecondVC'라고 입력한다.

첫번째 뷰 컨트롤러에 대한 코드이다. 다음 페이지로를 눌렀을 때 발생하는 이벤트 메소드는 moveNext이다.

여기서 중요한 것은 아래 코드이다. 이동할 뷰 컨트롤러 객체를 StoryboardID 정보를 이용하여 참조하고, 그 참조된 것을 인스턴스화 하는 부분이다. 이때, 먼저 스토리보드 파일의 내용을 참조할 수 있어야 하는데, Main.storyboard는 self.storyboard 속성을 통해 참조할 수 있다. 스토리보드 객체가 참조될 때의 타입은 UIStoryboard이다.

instantiateViewController(withIdentifier:)
➡️ 이 메소드는 인자값으로 입력받은 아이디를 이용하여 스토리보드에서 뷰 컨트롤러를 찾고, 연결된 클래스를 읽어와 뷰 컨트롤러에 대한 인스턴스를 생성한다.

	guard let uvc = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") 
    else { return }

여기서 guard를 사용한 이유는 self.storyboard 값이 옵셔널 타입이기 때문에 경우에 따라 nil이 들어올 수 있지만 비어있으면 안되는 필수 조건이기 때문에 사용하였다.

마지막으로 present 메소드를 통해 첫번째 인자로 uvc 변수를 넣고
두번째 화면 SecondViewController에서 Back 버튼에 대한 액션 함수에 다음과 같이 dismiss메소드를 호출하여 다신 두번째 화면을 내릴수 있다.

참고문헌: http://www.yes24.com/Product/Goods/60638047

profile
🧑🏻‍💻iOS

0개의 댓글