之前在公司负责整个客户端的联合登陆,在加入微博的联合登录时遇到了一个问题,因为注册登陆界面本身就是present出来的,所以,当本地没有安装微博客户端时,不能present出微博的webview登陆页面
看了一下报错:Attempt to present <UINavigationController: > on <RootViewController: > whose view is not in the window hierarchy!
原因大概就是直接拿keyWindow的rootViewController来presentViewController
但是我已经弹了个模态登陆/注册Controller了。。。。
当时给他们反馈了,说是会在3月中旬出新的版本解决,但最后在三月还没出。
最后想了两个方案来解决这个问题:
1.把我本地的注册登陆页面改一个展现方式,用addChildViewController来展示,即自己来写一个
- (void)presentChildViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
再实现一个将childViewCOntroller移除
-(void)removeViewController:(UIViewController *)viewController
2.另外一个思路就是它调用的是rootVIewController 的- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
那我们Hacky一下它,如果现在的栈顶VC有presentedVC则循环来找到最顶部presentedVC来present微博的webview
如果栈顶VC没有presentedVC 则调用super 的 present 方法
最后两个方法可以解决该问题,只是简单提供思路,抛砖引玉
以上~