今天遇到一个问题简单描述一下:
需求:登录成功之后,需要判断是否绑定手机,没有绑定present一个手机页面,然后Tabbar切换到首页。这个需求还可以,但是业务里登录,注册,忘记密码等等都是modal出来的。所以登陆完之后不得不全部dissmiss掉,然后再通知到我的界面做相应操作。
遇到问题:
whose view is not in the window hierarchy!
分析:也就是你现在的Present的视图并不是Windows视图,因为现在还有没有dismiss掉的视图。
解决:1.如果是用错顶层视图的可以找到顶层视图。 2,如果没有dismiss掉就进行presnt的可以,dissmiss callback进行处理。
代码(Swift):
找到顶层视图:
代码语言:javascript复制///获取当前控制器
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所有的界面:
代码语言:javascript复制///所有页面都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)
}
最后就简单了
代码语言:javascript复制 dissAllToRoot(currentVc: self) {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "****"), object: nil)
}