iOS에서 화면을 전환하는 방법에는 여러가지가 있다.
앱에서 화면을 전환은 서로 참조 관계가 성립한다.
무슨말이냐면
이와 같은 과정으로 기존화면과 새로운 화면 사이에는 서로 참조 관계가 성립한다.
때문에 앱에서 화면 전환은 단순하지가 않은 것 같다. (데이터를 전달해야한다면 더더욱)
뷰를 이용한 화면 전환
- View Controller의 View 위에 다른 View를 가져와 바꿔치기하기
뷰 컨트롤러에 의한 화면 전환
- View Controller에서 다른 View Controller를 호출하여 전환하기
- Navigation Controller를 사용하여 화면 전환하기
- 화면 전환용 객체 세그웨이(Segueway)를 사용하여 화면 전환하기
하나의 뷰 컨트롤러는 하나의 루트 뷰를 관리한다.(MVC패턴에 따르면)
만약 뷰를 이용하여 화면을 전환한다면, 다른 뷰 컨트롤러에 의해 관리되고 있는 뷰를 가져와 관리해아하는 꼴이다. 뷰를 제어할 책임이 모호해 진다. 때문에 이는 MVC패턴에 위배되고, 잘 사용하지 않는다.
present(<새로운 뷰 컨트롤러 인스턴스>, animated: <애니메이션 여부>)
present(_: animated:completion:)
화면전환은 비동기적으로 이뤄지므로, present 다음에 작성된 구문이 화면 전환이 끝난 후 호출됨을 보장할 수 없다. 이는 completion을 이용함으로써 해결할 수 있다. completion은 클로저를 사용하여 화면전환이 완전히 끝난 후에 호출되는 함수이다.
dismiss(animated:)
dismiss(animated:completion:)
걷어낸 화면 뷰의 컨트롤러 객체는 운영체제에 의해 곧 메모리에서 삭제된다.
화면을 걷어내는 객체는 자기 자신이 아니다. VC1이 VC2를 불렀다고 가정한다면, VC2가 화면에서 걷어지기 위해서는 VC1이 일해줘야한다.
VC1이 VC2를 불러냈으므로, VC2를 걷어내는 것도 VC1이 해야할 일!
// FirstViewController
@IBAction func nextButtonTouched(_ sender: Any) {
guard let yellowVC = self.storyboard?.instantiateViewController(identifier: "yellowVC") else { return }
self.present(yellowVC, animated: true)
}
// YellowViewController
@IBAction func closeButtonTouched(_ sender: Any) {
// self.dismiss(animated: true, completion: nil)
self.presentingViewController?.dismiss(animated: true)
}
self.dismiss
의 경우 VC2가 VC2를 걷어내는, 자기가 자기 자신을 사라지게 하는 함수이다.
VC1이 VC2를 불러냈으므로, VC2를 걷어내는 것도 VC1이해야할 일이라고 했다. 따라서 self.presentingViewController
의 dismiss
함수를 호출한다.
잠깐, self.presentingViewController.dismiss를 사용하지 않고 self.dismiss를 써도 잘 동작하는데??
self.dismiss
와 self.presentingViewController.dismiss
의 동작은 사용자의 관점에서 전혀 차이를 느낄 수 없다. 이 두 함수의 차이는 completion 함수 구현 시 발생한다. dissmiss를 한 이후에 결과를 presentingViewController에게 알려주느냐 아니면 사라진 ViewController(self)에게 알려주느냐의 차이가 있다.
네비게이션 컨트롤러는 현재 화면에 표시되고 있는 뷰 컨트롤러들을 내비게이션 스택(Navigation Stack)을 이용하여 관리한다. 가장 아래에 있는(= 가장 첫번째) 화면이 루트 뷰 컨트롤러이고, 최상위에 있는 화면이 현재 표시되고 있는 화면이다.
pushViewController(_: animated:)
popViewController(aminated:)
세그웨이(Segueway)는 두 개의 View Controller 사이에 연결된 화면 전환 객체를 의미한다.
스토리보드를 통해 출발지와 목적지를 직접 지정하는 방식을 세그웨이(Segueway)를 이용한 화면전환이라고 한다. 화면 전환을 구현 하는 데 가장 단순한 방식이다.
Action Segueway 종류
Show
: navigation controller를 이용시 navigation stack에 쌓이게 된다. 왼쪽에서 오른쪽으로 화면이 나타나며 되돌아가기 버튼을 제공한다. 만약 navigation controller를 사용하지 않을 경우 presented modally와 동일하게 작동한다.
Show Detail
: Split View Controller에서 다루게 된다. 2개의 column으로 나누어진 화면에서 오른쪽에 자세한 정보가 나타나게 된다.
ex) Message
Present Modally
: presentation option을 통해서 다양한 애니메이션을 적용할 수 있다. 이전 view controller를 덮으면서 새로운 화면이 나타나게 된다. 기본적으로는 아래에서 위로 새로운 화면이 덮혀지는 효과가 있다.
ex) TouchID & Passcod in Settings
Present As Popover
: IPad에서 동작시 destination이 나타나고 임임의 다른 곳을 선택시 자동으로 화면에서 사라지게 된다(dismiss)
Custom
: 마음대로 세그웨이를 지정할 수 있다.