🍎 화면 전환 방법
- Storyboard를 통해 전환하는 방식
- 소스코드를 통해 전환하는 방식
- 본격적인 설명에 앞서 'PUSH'와 'PRESENT'에 대한 심플한 설명을 하겠습니다.
PUSH
Navigation Controller를 사용하여 Stack형식으로 화면전환을 하는 방식. (PUSH & POP)
avigationController의 PUSH같은 경우, 다음 경로로도 이어지는 형태의 화면전환을 할 때 주로 많이 사용합니다.
NavigationController 개념 참고
PRESENT
ViewController 위에 다른 View Controller를 호출하여 화면전환을 하는 방식.
원하는 화면전환 스타일을 설정할 수 있습니다.
- PRESENT를 통한 화면전환 시 스토리보드 상 or 코드 상에서의 작업을 통해 full screen으로 채울 수도 있습니다.
-
우리가 흔히 쓰는 카카오톡으로 PUSH와 PRESENT의 예를 들자면,
-
프로필 사진이 세로방향으로 올라오는 것은 (full screen) Present 전환방식을 이용한 것으로 예상되고, 추천채널화면이 나타나는 것은 네비게이션컨트롤러 PUSH방식으로 예상됩니다.
-
그럼 이제 본격적으로 화면전환방식에 대한 이야기를 하겠습니다.
🍏 Storyboard를 통해 전환하는 방식
- 화면 전환용 객체 세그웨이(Segueway)를 사용하여 화면을 전환합니다.
- Segueway에는 Action Segueway와 Manual Segueway가 있는데, 저희는 Action Segueway 중 Show와 Present Modally를 사용해볼 것입니다.
🧃 Segueway로 PUSH
- 세그로 연결하는 방법은 굉장히 쉽습니다.
- 네비게이션 스택 형태로 PUSH하려면, 네비게이션 컨트롤러를 생성하고 루트뷰에서 전환할 화면으로 우클릭 드래그&드랍으로 연결한 후 Show를 클릭하면 됩니다. 다시 전 화면으로 돌아갈 때는 TabBar에 있는 Back버튼을 누르거나, 버튼을 만들어주고 그와 연결된 코드를 작성하면 됩니다.
- 네비게이션 형식을 이용하지않는다면 Show로 연결해도 Present로 연결한 것과 동일하게 Modal로 새로운 화면을 띄웁니다.
🧃 Segueway로 PRESENT
- 우클릭 드래그&드랍 후 Present Modally를 선택하면 됩니다. 돌아올 때는 사용자가 화면을 밑으로 쓸어내리는 액션을 취하거나, 버튼을 만들어줘서 코드를 작성하는 방식을 사용하면 됩니다.
🍏 소스코드를 통해 전환하는 방식
- Assistant를 통해 특정 버튼을 IBAction함수로 만들고, 특정 코드를 통해 화면을 전환합니다.
- 소스코드를 이용하여 전환하기 때문에 세그로 연결할 필요가 없습니다.
🧃 코드로 PUSH
@IBAction func tabCodePushButton(_ sender: UIButton) {
guard let viewController = self.storyboard?.instantiateViewController(identifier: "CodePushViewController") else { return }
self.navigationController?.pushViewController(viewController, animated: true)
}
- 지정된 식별자를 가지고 스토리보드의 데이터를 초기화 해 뷰 컨트롤러를 만드는 메서드인 'instantiateViewController(identifier:)를 이용합니다. 이 메서드를 통해 스토리보드 상에 존재할지 모르는 다른 뷰컨트롤러를 인식하고, 데이터가 초기화되며 새로운 인스턴스가 생성되게 됩니다. (옵셔널 해제를 위해 guard 문 사용)
- 이 후 네비게이션방식의 PUSH로 연결해주면 된다.
POP
- 전환된 화면에서 이전 화면으로 돌아올 때는 popViewController() 메서드를 사용하면 됩니다.
🧃 코드로 PRESENT
@IBAction func tabCodePresentButton(_ sender: UIButton) {
guard let viewController = self.storyboard?.instantiateViewController(identifier: "CodePresentViewController") else { return }
self.present(viewController, animated: true, completion: nil)
}
- 인스턴스생성 메서드는 동일하게 사용하지만 화면 전환 시 호출하는 메서드가 다릅니다. present 형식으로 화면전환할 시에는 말 그대로 present(_ ,animated:completion:)을 사용하면 됩니다.
- present() 메서드에서는 추가적으로 completion이라는 파라미터가 있는 것을 볼 수 있는데, Apple 공식 문서를 보면 "프레젠테이션이 끝난 후 실행할 블록. 이 블록은 반환 값이 없으며 매개 변수를 받지 않습니다. 이 매개 변수에 nil을 지정할 수 있습니다."라고 정의되어있다. 말 그대로 화면전환 후 실행할 내용을 담는 곳이며, 클로저 형태로 정의되어 있습니다.
Dismiss
- PRESENT 방식으로 전환된 화면엣거 이전 화면으로 돌아갈 때는 dismiss() 메서드를 사용하면 됩니다.
잘 참고하고 갑니다!