본문 바로가기
2023년 부터/iOS&Swift

[iOS] ScrenDelegate 와 Appdelegate에서 navigationViewcontroller 호출하기

by JeongUPark 2024. 2. 8.
반응형

딥링크를 사용하여 동작을 할 경우 AppDelegate나 ScrenDelegate에서 ViewController를 호출해야 할 경우가 있습니다.

이때 NavigationController를 호출하는 방법을 알아 보겠습니다.

1. UIWindow의 rootViewController가 UINavigationController인 경우

앱의 rootViewController가 UINavigationController인 경우, 직접 접근할 수 있습니다.

if let navigationController = self.window?.rootViewController as? UINavigationController {
    // navigationController 사용
}

2. UITabBarController를 사용하는 경우

rootViewController가 UITabBarController인 경우, 선택된 탭 또는 특정 탭의 UINavigationController에 접근해야 할 수 있습니다.

if let tabBarController = self.window?.rootViewController as? UITabBarController,
   let navigationController = tabBarController.selectedViewController as? UINavigationController {
    // navigationController 사용
}

if let tabBarController = self.window?.rootViewController as? UITabBarController,
   let navigationController = tabBarController.viewControllers?[desiredIndex] as? UINavigationController {
    // navigationController 사용
}

3. UISplitViewController 또는 기타 커스텀 컨테이너 뷰 컨트롤러 사용하는 경우

rootViewController가 UISplitViewController이거나 사용자 정의 컨테이너 뷰 컨트롤러인 경우, 해당 뷰 컨트롤러의 구조에 따라 UINavigationController에 접근해야 합니다. 예를 들어 UISplitViewController에서:

if let splitViewController = self.window?.rootViewController as? UISplitViewController,
   let navigationController = splitViewController.viewControllers.last as? UINavigationController {
    // navigationController 사용
}

4. SceneDelegate를 사용하는 경우(iOS 13 이상)

iOS 13 이상에서는 SceneDelegate에서 UI 관련 작업을 관리합니다. 이 경우 AppDelegate 대신 SceneDelegate에서 UINavigationController에 접근해야 합니다.

if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
   let navigationController = windowScene.windows.first?.rootViewController as? UINavigationController {
    // navigationController 사용
}

 

 

결론

사실 1번, 2번, 3번 방법보다 4번 방법만으로도 충분히 활용가능합니다.

반응형