[Swift] ViewController 화면전환 방법

Tak·2021년 11월 3일
3

Swift

목록 보기
1/1
post-thumbnail

ViewController의 화면 전환 방법에 대해 알아보자.

화면 전환 방법에는 대표적으로 네 가지 방법이 있다.

  1. ViewController의 view 바꿔치기
  2. ViewController가 다른 ViewController를 호출(present)
  3. NavigationViewController 사용하여 화면 전환(push)
  4. 화면 전환용 객체 Segue 사용

ViewController의 view를 바꿔치는 방법은 메모리 overflow 위험이 있기 때문에 좋은 방법이 아니라고 한다.
오늘은 이 방식은 건너뛰고 다른 방법들을 알아보자.


ViewController가 다른 ViewController를 호출(present)

필자가 가장 애용하는 방식이자 가장 대표적인 방법이 아닐까 싶다.
다른 ViewController를 Modal로 띄우는 방법으로 다음 코드를 사용한다.

guard let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "secondViewControllerID") as? SecondViewController else { return }
        // 화면 전환 애니메이션 설정
        secondViewController.modalTransitionStyle = .coverVertical
        // 전환된 화면이 보여지는 방법 설정 (fullScreen)
        secondViewController.modalPresentationStyle = .fullScreen
        self.present(secondViewController, animated: true, completion: nil)

위 코드를 @IBAction func 메서드안에 작성한 후 Storyboard에서 ViewController의 connection inspector 에서 해당하는 Button과 연결시켜주면 된다.

단 Storyboard상의 SecondViewController의 identify inspector에서 instantiateViewControlleridentifier 값(secondViewControllerID)을 StoryboardID에 적어주어야 한다.

이후에 secondViewController에서 다시 첫번째 ViewController로 돌아가는 버튼도 만들어 줬다.

@IBAction func back(_ sender: Any) {
        self.presentingViewController?.dismiss(animated: true)
}

버튼을 클릭하면 정상적으로 화면 전환이 되는걸 확인할 수 있다.


NavigationController를 사용하기 때문에 먼저 NavigationController를 embed in 해주어야 한다.
storyboard에서 첫번째 ViewController에 커서를 맞춘뒤 아래 사진처럼 embed in 한다.그럼 storyboard상에는 이렇게 표시된다. 그 후 아래 코드를 ViewController에 작성한다.

let pushVC = self.storyboard?.instantiateViewController(withIdentifier: "secondViewControllerID")

self.navigationController?.pushViewController(pushVC!, animated: true)

이게 끝이다. 잘 실행되는 것을 확인할 수 있다.

이번에는 secondViewController에서 back버튼을 구현해주지 않았다. NavigationController는 Stack에 쌓이는 방식이기 때문에 back버튼이 자동으로 생성되기 때문이다.


화면 전환용 객체 Segue 사용

Segue를 사용하는 방식은 storyboard상에서 경로가 시각적으로 나타난다.
이 방식의 장점은 ViewController에 대한 정보를 몰라도 화면 전환이 가능하다는 것이다.
Segue에도 종류가 있다.

1) Action Segue: 출발점이 ViewController가 아닌 것(ex: button)

  • 따로 코딩이 필요하지 않다.
    마우스 우클릭 또는 control키를 누른 상태로 드래그해서 모두 화면전환이 가능하지만 각각 다른 기능을 한다는 것만 알아두고 넘어가자. 우리는 show를 클릭할 거다. 그럼 끝이다.

    여기서 secondViewController가 Modal형식으로 띄워지는게 싫다면 attributes inspector에서 presentation을 fullscreen으로 변경해주면 된다.

2) Manual Segue: 출발점이 ViewController인 것

  • performSegue(withIdentifier: sender:)를 구현해야 한다.
    (1) 이동
    - ViewController를 이동시킬 부분에 drag&drop -> "show"선택 -> "segue identifier"기입
    - 이용하고 싶은 곳에서 performSegue로 호출
        ```
        @IBAction func move(_ sender: Any) {
            self.performSegue(withIdentifier: "mySegue", sender: self)
        }
        ```
    (2) unwind
    - 출발점 ViewController에 임의의 메서드 @IBAction으로 등록 -> unwind할 viewController에서 되돌아가는 버튼에서 Dock bar의 "Exit"에 drag&drop
     ```
     @IBAction func unwindToVC(_ segue: UIStoryboardSegue) {
     }
     ```
     ※위 메서드를 처음에 이동한 ViewController에 작성하는 것을 주의!

3) SegueWay 발생 전에 발동 메서드

  • prepare(for: sender: ) {...} 구현
  • if segue.identifier == "SegueWayName" 특정 SegueWay 구분해서 사용
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if(segue.identifier == "mySegue1") {
        // one
    } else {
        // ...
    }
}

⚠️ 주의!
segue를 통해 화면을 연결하다 보면 View가 많아졌을 시 지저분해 보일 수 있음...

해당 포스팅을 작성하면서 알게된건데 NavigationController를 Embed in 했다가 풀고 싶을 경우 단순히 생성된 NavigationController를 지우기만 하면 이후 runtime시 실행이 안될 경우가 있다.
에러메시지 -> [WindowScene] Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?
이럴 경우에 초기 ViewController 선언 에러가 난 것이므로 storyboard의 첫번째 ViewController의 attributes inspector에서 Is Initial ViewController 항목에 체크해주면 된다.

참고 :

profile
iOS 왕초보를 위한 블로그

0개의 댓글