iOS 최상단 ViewController + UIWindow (keywindow)
최상단에 위치한 ViewContoller를 재귀를 이용해 안전하게 찾기
최상단 ViewController를 찾는 코드
각 컨트롤러의 객체 타입에 맞게 재귀를 이용해 최상단 뷰 컨트롤러를 찾는 코드
public extension UIViewController {
func topMostViewController() -> UIViewController {
if let presentedViewController = self.presentedViewController {
return presentedViewController.topMostViewController()
}
if let navigationController = self as? UINavigationController {
return navigationController.visibleViewController?.topMostViewController() ?? navigationController
}
if let tabBarController = self as? UITabBarController {
return tabBarController.selectedViewController?.topMostViewController() ?? tabBarController
}
return self
}
}
UIwindow Keywindow Extension
최상단 뷰를 찾았다면 해당 코드와 궁합이 좋음
public extension UIWindow {
static var keyWindow: UIWindow? {
UIApplication.shared.connectedScenes
.compactMap({ $0 as? UIWindowScene })
.flatMap({ $0.windows })
.first(where: { $0.isKeyWindow })
}
}
Usage
알림이나 공유하기 기능 등에 사용할 수 있음
func show(_ activityViewController: UIActivityViewController) {
if let keyWindow = UIWindow.keyWindow {
let topViewController = keyWindow.rootViewController?.topMostViewController()
topViewController?.present(activityViewController, animated: true, completion: nil)
}
}
'apple > iOS, UIKit, Documentation' 카테고리의 다른 글
[iOS] rootViewController 교체하기 (0) | 2022.08.10 |
---|---|
[iOS] present 이후 pushViewController (0) | 2022.08.05 |
[iOS/Swift] init과 super.init에 대해서 알아보자. 🤔 (0) | 2022.02.25 |
iOS 오픈소스 라이선스 페이지 (뱅크샐러드) (0) | 2022.02.23 |
iOS Lottie 알아보기 (.json, .lottie) (0) | 2022.02.19 |