일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring
- Flutter
- UITableView
- createml
- Sendbird
- Apple Developer Academy
- watchkit
- cloud functions
- backend
- Delegate Pattern
- Firebase
- tabman
- widgetkit
- app intents
- swift concurrency
- Complication
- task.yield()
- coreml
- fcm
- 코테
- ios
- Tuist
- Coding Test
- UIDatePicker
- WWDC22
- github
- SwiftUI
- Swift
- UIStackView
- Project
- Today
- Total
azhy의 iOS 이야기
[iOS/Swift] dismiss 하고 present 넘어가기 (Presented vs Presenting ViewController) 본문
[iOS/Swift] dismiss 하고 present 넘어가기 (Presented vs Presenting ViewController)
azhy 2024. 11. 12. 20:232022년 7월 7일에 작성됨
PresentedVC vs PresentingVC
먼저 이 두 개의 ViewController를 먼저 알아야 합니다.
PresentedViewController : 자신이 호출한 ViewController
PresentingViewController : 자신을 호출한 ViewController
이 친구들을 통해서 자신을 호출한 ViewController 가 있는지를 확인해서 dismiss 할 것인지에 대한 판단을 할 수 있습니다.
func dismiss(viewController: UIViewController) {
if presentedViewController == viewController {
dismiss(animated: true)
}
}
extension UIViewController {
func back() {
if presentingViewController != nil {
dismiss(animated: true, completion: nil) // present
} else {
navigationController?.popViewController(animated: true) // push
}
}
}
dismiss 하고 present
// rootVC -> FirstVC -> SecondVC
self.dismiss(animated: true) {
self.present(SecondViewController(), animated: true, completion: nil)
}
이렇게 작성해버리면 순서가 현재 자신인 FirstVC을 dismiss 하고 SecondVC로 present 하는 것이라 없어진 FirstVC을 가지고 present를 할 수 없습니다.
// rootVC -> FirstVC -> SecondVC
guard let pvc = self.presentingViewController else { return }
self.dismiss(animated: true) {
pvc.present(SecondViewController(), animated: true, completion: nil)
}
그래서 presentingViewController (자신을 호출한 VC), 이 예시에서는 rootVC 가 됩니다. FirstVC 를 dismiss 해주고 설정해 놓은 pvc를 가지고 present 하는 거라 정상적으로 실행이 됩니다.
rootViewController 하위 viewController 삭제 후 present
self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)
rootViewController 하위 viewController 를 단순히 지우고만 싶으면 이 코드를 쓰면 됩니다.
self.view.window?.rootViewController?.dismiss(animated: false, completion: {
let newVC = NewViewController()
newVC.modalTransitionStyle = .crossDissolve
newVC.modalPresentationStyle = .fullScreen
self.present(newVC, animated: true, completion: nil)
})
이 경우는 페이지를 많이 넘어간 상태에서 작업이 마무리되고 쓸 수 있는 방법입니다.
예를 들어 rootVC -> FirstVC -> SecondVC -> ThirdVC에서 작업을 하다가 완료된 상태에서 새로운 newVC으로 넘어가야 하는 경우라면 rootViewController.dismiss로 하위 VC들을 dismiss 시키고 completion을 통해 dismiss가 끝나면 다음페이지로 넘어갈 newVC을 세팅해서 present 시켜주는 코드입니다.
'Swift' 카테고리의 다른 글
[iOS/Swift] UIDatePicker 최소, 최대 날짜 설정하기 (0) | 2024.11.12 |
---|---|
[iOS/Swift] Lottie 를 사용해서 애니메이션을 만드는 법 (2) | 2024.11.12 |
[iOS/Swift] UITableView scrollToRow, 특정 셀로 스크롤 이동 (0) | 2024.11.12 |
[iOS/Swift] UITableView, 셀 재사용 시 발생하는 문제 (0) | 2024.11.12 |
[iOS/Swift] View와 Button 에 click action 등록하기 (0) | 2024.11.12 |