whose view is not in the window hierarchy!

ZY_FlyWay發表於2018-03-22

今天遇到一個問題簡單描述一下:


需求:登入成功之後,需要判斷是否繫結手機,沒有繫結present一個手機頁面,然後Tabbar切換到首頁。這個需求還可以,但是業務裡登入,註冊,忘記密碼等等都是modal出來的。所以登陸完之後不得不全部dissmiss掉,然後再通知到我的介面做相應操作。


遇到問題:

 whose view is not in the window hierarchy!

分析:也就是你現在的Present的檢視並不是Windows檢視,因為現在還有沒有dismiss掉的檢視。


解決:1.如果是用錯頂層檢視的可以找到頂層檢視。  2,如果沒有dismiss掉就進行presnt的可以,dissmiss  callback進行處理。


程式碼(Swift):


找到頂層檢視:

///獲取當前控制器
func currentVc() ->UIViewController{
    
    var vc = UIApplication.shared.keyWindow?.rootViewController
    
    if (vc?.isKind(of: UITabBarController.self))! {
        vc = (vc as! UITabBarController).selectedViewController
    }else if (vc?.isKind(of: UINavigationController.self))!{
        vc = (vc as! UINavigationController).visibleViewController
    }else if ((vc?.presentedViewController) != nil){
        vc =  vc?.presentedViewController
    }
        
    return vc!
    
}

dismiss所有的介面:

///所有頁面都diss到根目錄
func dissAllToRoot(currentVc:UIViewController,completion: (() -> Swift.Void)? = nil){
    var vc = currentVc.presentingViewController
    if vc?.presentingViewController == nil {
        currentVc.dismiss(animated: true, completion: completion)
    }
    
    while ((vc?.presentingViewController) != nil) {
        vc = vc?.presentingViewController
    }
    
    vc?.dismiss(animated: true, completion: completion)
}


最後就簡單了

 dissAllToRoot(currentVc: self) {
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "****"), object: nil)
        }




相關文章