You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// UIApplication 익스텐션extensionUIApplication{func topViewController()->UIViewController?{// 애플리케이션 에서 키윈도우로 제일 아래 뷰컨트롤러를 찾고// 해당 뷰컨트롤러를 기점으로 최상단의 뷰컨트롤러를 찾아서 반환letscenes=UIApplication.shared.connectedScenes
letwindowScenes= scenes.first as?UIWindowScenereturn windowScenes?.windows
.filter{ $0.isKeyWindow }.first?.rootViewController?.topViewController()}}// UIViewController 익스텐션extensionUIViewController{func topViewController()->UIViewController{// 프리젠트 방식의 뷰컨트롤러가 있다면
if let presented =self.presentedViewController {// 해당 뷰컨트롤러에서 재귀 (자기 자신의 메소드를 실행)return presented.topViewController()}// 자기 자신이 네비게이션 컨트롤러 라면
if let navigation =selfas?UINavigationController{// 네비게이션 컨트롤러에서 보이는 컨트롤러에서 재귀 (자기 자신의 메소드를 실행)return navigation.visibleViewController?.topViewController()?? navigation
}// 최상단이 탭바 컨트롤러 라면
if let tab =selfas?UITabBarController{// 선택된 뷰컨트롤러에서 재귀 (자기 자신의 메소드를 실행)return tab.selectedViewController?.topViewController()?? tab
}// 재귀를 타다가 최상단 뷰컨트롤러를 반환returnself}}
사용 예시
classSomeClass{// 이제 뷰컨트롤러가 아닌 클래스에서도 최상단 뷰컨트롤러를 찾을 수 있습니다func doSomethingWithTopVC(){
guard let topVC =UIApplication.shared.topViewController()else{return}
topVC.view.backgroundColor =.yellow
}}