본문 바로가기

Project/PhotoDiary

👍 사용자가 버튼을 눌렀을 때 현재 보여지고 있는 시트(DiarySheetViewController)를 닫고, 그 이후에 PhotoDiaryViewController를 전체화면으로 띄우기 위한 흐름

 

🔁 최종 정리 흐름도

[MainTabBarController]  ← 앱의 rootViewController
     │
     ▼
[DiarySheetViewController] ← .pageSheet 형식으로 띄워짐
     │
     ▼ (버튼 눌러서 dismiss됨)
[PhotoDiaryViewController] ← NavigationController로 감싸져 전체화면으로 띄워짐

 

 

DiarySheetViewController 안에서 특정 버튼을 눌렀을 때 PhotoDiaryViewController를 전체화면으로 띄우면?

@objc private func photoDiaryTapped() {
    dismiss(animated: true) {
        let photoVC = PhotoDiaryViewController()
        let nav = UINavigationController(rootViewController: photoVC)
        nav.modalPresentationStyle = .fullScreen

        if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
           let window = windowScene.windows.first,
           let rootVC = window.rootViewController {
            rootVC.present(nav, animated: true)
        }
    }
}

 

  • DiarySheetViewController가 먼저 dismiss 
  • 그 후에 MainTabBarController (rootVC) 가 PhotoDiaryViewController를 navigation으로 감싸서 전체화면으로 띄움
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
   let window = windowScene.windows.first,
   let rootVC = window.rootViewController {

 

  • 현재 앱의 가장 상위 계층 (rootViewController) 를 찾음
  • 앱에는 보통 하나의 UIWindowScene과 하나의 UIWindow가 있고, 그 안에 rootViewController인 MainTabBarController가 있음

 

💡 이렇게 복잡하게 하는 이유는?

현재 컨텍스트(DiarySheetViewController)는 이미 시트(반만 보이는 화면)로 띄워져 있기 때문에, 그 위에서 또 present() 하면 이상한 계층 구조가 생길 수 있음
그래서 현재 시트를 먼저 닫고, 앱의 최상위 계층(rootVC) 에게 새로운 화면을 띄우게 만드는 구조입니다.