본문 바로가기
iOS/iOS

[iOS] iOS의 화면 전환 - View Controller 호출 전환 (1/3)

by 원만사 2021. 12. 3.
반응형

화면을 전환하는 4가지 방법

 iOS의 화면 전환 방법에는 총 4가지가 있다.

  1. View Controller의 View 위에 다른 View로 바꿔치기
  2. View Controller에서 다른 View Controller를 호출하여 전환하기 (present)
  3. Navigation Controller를 사용하여 화면 전환하기 (push) - 링크
  4. 화면 전환용 객체 Segueway를 사용하기 - 링크

 첫 번째 방법은 메모리 누수 위험이 있어서 되도록이면 사용하지 않는 방식이다. 이를 제외한 나머지 방법들 중 먼저 View Controller에서 다른 View Controller를 호출하여 전환하는 방법에 대해서 살펴보자.

 

View Controller에서 다른 View Controller를 호출하여 전환하기(present)

 이 방법은 presentation 방식이라고도 불린다. 기존 View Controller 위에 새로운 View Controller의 화면을 덮는 방식이다. 새로운 화면이 modal 방식으로 나타난다.

 

화면 호출

func present(_ viewControllerToPresent: UIViewController, 
    animated flag: Bool, 
  completion: (() -> Void)? = nil)

[Parameters]

  • viewControllerToPresent : 새로 이동할 화면의 ViewController 인스턴스
  • flag : 화면 전환 시 애니메이션 효과 사용 여부
  • completion : 화면 전환이 완료되는 시점에 맞춰 호출되는 클로저

이전 화면으로 돌아가기

func dismiss(animated flag: Bool, 
  completion: (() -> Void)? = nil)

[Parameters]

  • flag : 화면 전환 시 애니메이션 효과 사용 여부
  • completion : 화면 전환이 완료되는 시점에 맞춰 호출되는 클로저

 

예제

 위의 사진에서 Present 화면 전환 버튼을 눌렀을 때 'Modal'이 적혀 있는 화면을 띄우는 코드를 작성해보자. 먼저 'Modal' 화면에 Storyboard ID를 지정해야 한다. 'Modal' 화면을 클릭하고 코드 인스펙터에서 Storyboard ID를 지정하자.

  이제 ViewController.swift에서 해당 Storyboard ID를 이용해서 View Controller를 찾아서 인스턴스화를 시켜준다. 화면 전환 버튼 액션을 추가하고 그 안에 다음과 같은 코드를 작성한다.

 

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

 

 instantiateViewController(withIdentifier:) 메서드는 파라미터로 주어진 Storyboard ID를 찾아 View Controller를 인스턴스화 시켜주는 메서드이다. 이제 viewController에 'Modal' 화면의 View Controller가 인스턴스화 되어 담겨 있다. 이제 present 함수를 사용하여 해당 화면을 불러오자.

 

self.present(viewController, animated: true, completion: nil)

 

 첫 번째 파라미터로 새로 이동할 화면의 View Controller 인스턴스를 담아 줬고 애니메이션은 true로 설정해줬다. 최종 코드는 다음과 같다. 이제 버튼을 누르면 다음과 같이 화면 전환이 되는 것을 볼 수 있다.

 

@IBAction func clickPresentButton(_ sender: UIButton) {
        guard let viewController =
                self.storyboard?.instantiateViewController(withIdentifier: "presentViewController")
        else { return }
        
        self.present(viewController, animated: true, completion: nil)
    }

 

 그럼 이제 'Modal' 창에서 다시 이전 화면으로 돌아가는 버튼을 만들어보자. 먼저 Modal 화면에 버튼을 하나 생성하고 버튼 액션을 해당 화면의 View Controller에 연결한다. 그 후 다음과 같은 코드를 추가하면 된다.

 

@IBAction func clickBackButton(_ sender: UIButton) {
        self.presentingViewController?.dismiss(animated: true, completion: nil)
    }

 

 그 후 해당 버튼을 누르면 이전 화면으로 돌아가는 것을 확인할 수 있다. 최종 동작 화면은 아래와 같다.

 

참고

- https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present

- https://developer.apple.com/documentation/uikit/uiviewcontroller/1621505-dismiss

반응형

댓글