일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Refresh
- PushNotification
- uikit
- protocol
- apns
- escaping
- list
- Observer
- 글또
- calendar
- class
- viewlifecycle
- SWIFT
- segue
- NotificationCenter
- array
- 화면전환
- SWIFTUI
- Switch
- 고차함수
- mvvm
- singleton
- Animation
- http
- ScrollView
- Git
- struct
- error
- IOS
- self
- Today
- Total
seong_hye, the developer
UIKit) 화면 전환 방식 본문
📘 Swift - UIKit) 화면 전환 방식
Swift에는 화면 전환(화면 이동)을 구현하는 여러 방식이 존재한다
이에 대해 하나하나 알아가보자
🔹화면 전환 3가지 방식
방식 | 설명 | 사용 환경 |
Push | Navigation Stack에 밀어 넣는 방식 | UINavigationController |
Present (Modal) | 현재 화면 위에 새 화면을 덮는 방식 | 모든 UIViewController 가능 |
Segue | 스토리드에서 화살표로 연결 | 스토리보드 기반 |
🔹1. PushViewController 방식
현재 UINavigationController 가 관리하는 화면 스택에
새로운 ViewController를 추가(push) 하여 화면을 전환하는 방식
func pushViewController(
_ viewController: UIViewController,
animated: Bool
)
📌 특징
- 뒤로 가기 버튼이 자동 생성됨
- 이전 화면은 유지되고, 사용자는 뒤로 돌아갈 수 있음 (스택을 쌓는 형식)
- 좌 -> 우 슬라이드 제스처가 기본 지원됨
✅ 기본 문법
let nextVC = DetailViewController()
navigationController?.pushViewController(nextVC, animated: true)
✅ 필수 조건
- navigationController가 있어야 함
UINavigationCOntroller가 UINavigationController 안에 포함되어 있어야 pushViewController 사용 가능
- 그렇지 않으면 nil
호출해도 아무일도 일어나지 않게 됨
✅ 화면이 쌓이는 구조 (스택 구조)
[MainViewController] -> push -> [DetailViewController] -> push -> ...
이전 화면은 메모리 상에 유지됨
popViewController 호출하면 뒤로 가기
navigationController?.popViewController(animated: true)
🔹2. Modal 방식 - Present / Dismiss
현재 화면 위에 새로운 뷰 컨트롤러를 모달 방식으로 띄움
전환 방식은 덮는 구조로 스택 구조가 없어도 사용가능함
func present (
_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil
)
📌 특징
- 새로운 화면을 전체 또는 일부 덮음
- 모달 스타일 지정 가능 (풀스크린, 페이지 시트 등)
- 이전 화면으로 돌아갈 수 있지만 Back 버튼 없음 -> 직접 dismiss 해야 함
✅ 기본 문법
let nextVC = DetailViewController()
nextVC.modalPresentationStyle = .pageSheet // 스타일 지정 가능
present(nextVC, animated: true, completion: nil)
✅ modalPresentationStyle 종류
스타일 | 설명 |
.fullScreen | 전체 화면 덮기 (기본값) |
.pageSheet | 하단 시트 스타일 (iPad에선 팝업) |
.formSheet | 가운데 작게 뜨는 창(iPad 전용) |
.overFullScreen | 배경을 비치게 덮음(투명 배경 가능) |
✅ 이전 화면으로 - dismiss
presnet한 화면에서만 dismiss() 호출 가능
present 된 화면에서 데이터 전달 시 클로저나 delegate 사용
dismiss(animated: true, completion: nil)
🔍 push vs present 차이
항목 | pushViewController() | present() |
구조 | Navigation Stack에 쌓음 | 현재 화면 위에 덮기 |
뒤로 가기 버튼 | 자동 생성됨 | 직접 닫아야 함 |
상위 구조 필요 | NavigaionController 필요 | 불필요 |
적절히 사용 예 | 리스트 -> 상세, 단계적 화면 흐름 | 팝업창, 설정 화면, 로그인 |
✅ 실행 화면
🔹3. Segue (스토리보드 전용)
스토리보드에서 ViewController 간 화살표로 연결한 후, identifier 설정 후 코드에서 호출하는 방식
또는 자동 연결( show, present modally 등 선택 가능)
performSegue(withIdentifier: "goToDetail", sender: self)
📌 특징
- 스토리보드에서 시작적으로 연결
- 코드 없이도 전환 가능
- 단점 : 복잡한 전환 로직은 관리가 어려움
✅ Segue 설정 방법
➡️ 스토리보드에서 연결
1. 컨트롤을 누른 채로 -> ViewController -> 다른 ViewController로 드래그
2, 전환 방식 선택
3. Storyboard Segue의 identifier 설정 ( 속성창 )
✅ Segue 종류 (전환방식)
종류 | 설명 |
Show | NavigationController 있을 때 -> Push 전환 |
Present Modally | 모달 방식 전환 (Present) |
Custom | 사용자 지정 애니메이션 적용 가능 |
Popover | iPad 스타일의 팝업 표시 (앵커 필요) |
'IOS > UIKit' 카테고리의 다른 글
UIKit) View Life Cycle (0) | 2022.10.26 |
---|---|
Swift)SnapKit에 대해 알아보기 (0) | 2022.10.24 |
UIKit) AppDelegate & SceneDelegate 알아보기 (0) | 2022.10.19 |
Swift) 문법 정리 - 생성자 (0) | 2022.08.02 |
Swift) 코드 스니펫(Code Snippet) (0) | 2022.07.26 |