ViewController의 화면 전환 방법에 대해 알아보자.
화면 전환 방법에는 대표적으로 네 가지 방법이 있다.
ViewController의 view를 바꿔치는 방법은 메모리 overflow 위험이 있기 때문에 좋은 방법이 아니라고 한다.
오늘은 이 방식은 건너뛰고 다른 방법들을 알아보자.
필자가 가장 애용하는 방식이자 가장 대표적인 방법이 아닐까 싶다.
다른 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에서
instantiateViewController
의identifier 값(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를 사용하는 방식은 storyboard상에서 경로가 시각적으로 나타난다.
이 방식의 장점은 ViewController에 대한 정보를 몰라도 화면 전환이 가능하다는 것이다.
Segue에도 종류가 있다.
1) Action Segue: 출발점이 ViewController가 아닌 것(ex: button)
여기서 secondViewController가 Modal형식으로 띄워지는게 싫다면 attributes inspector에서 presentation을 fullscreen으로 변경해주면 된다.
2) Manual Segue: 출발점이 ViewController인 것
performSegue(withIdentifier: sender:)
를 구현해야 한다. ```
@IBAction func move(_ sender: Any) {
self.performSegue(withIdentifier: "mySegue", sender: self)
}
```
(2) unwind ```
@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
항목에 체크해주면 된다.
참고 :