개요

회사에서 iOS 개발하면서 두개의 앱을 연동해서 앱 스위칭하면서 왔다갔다하는 작업이 있었는데 스위칭하는 동시에 팝업 띄우려니

자꾸 Attempt to present <> on <> (from <>) whose view is not in the window hierarchy. 

오류가 나서 거의 반나절을 이리저리 보다가 해결함.

다른 포스트들을 참고하니 viewDidLoad(), viewWillAppear()등 스토리보드 생명주기에 관한 글만 있는데 해당사항이 없는

글이라 외국 포스트들을 참고하다가 해결하게 됨.

 

원인

앱을 스위칭하자마자 서버에 상태체크를 한번하고 그에 맞는 팝업을 띄워줘야하는데 자꾸 저 에러가 나면서 뷰가 무시됨..

대충 앱 특성상 뷰가 스택처럼 쌓이고 사라진다는점을 알고 있었기 때문에 그에 맞춰서 검색을 해봄

 

해결법

외국 포스트를 보다가 최상위 뷰컨트롤러에서 present를 하면 된다고 하는 댓글을 발견해서 바로 해결법을 찾아봄

extension UIApplication {
    class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
}

그러다가 최상위뷰컨트롤러를 상황에 맞게 찾아주는 extension을 발견하게 해서 적용한 뒤

UIApplication.topViewController()!.present(popupVC, animated: false)

위와 같이 스토리보드를 호출하니 해결됨.. 반나절의 삽질 끝

반응형
복사했습니다!