whose view is not in the window hierarchy!

最近在做项目时遇到这样的一个问题,工程里有三个A , B , C三个页面.由于项目需求需要,需从A页面present到B页面,B页面push到C页面,  C页面里有个webView,加载了H5页面.在H5页面里需要调用相机,当点击H5页面里调用相机按钮时,弹出相册选择的ActionSheet后,不管选择相机,相册,取消还是ActionSheet后面的灰色背景,程序直接退出到了A页面.下图是报错信息.

whose view is not in the window hierarchy!_第1张图片

关于这几个页面的跳转我测试了另外几种方法:

1. A页面present到B页面,B页面present到C页面,当点击相册ActionSheet里的任何东西,程序退出到A页面(此种情况下,也试了在B页面重新设置UINavgationController和在B页面及C页面都设置UINavgationController,结果依旧如此)

2.当A页面push到B页面,B页面present到C页面,点击相册ActionSheet里的任何东西,程序退出到B页面

3.当A页面push到B页面,B页面push到C页面,点击相册ActionSheet,选择相册或者相机,选择完照片或者拍摄照片后,能正常返回到C页面,并且正常显示照片.

whose view is not in the window hierarchy!_第2张图片

总结来说,只要是有present,就会出现问题.

问题出现的原因就是根控制器的问题.  从根控制器跳转到B页面或者C页面,在H5页面调用相机时,由于UIImagePickerController也是由根控制器跳转出来的,所以就产生了冲突,当UIImagePickerController消失时,调用dismiss方法,就把present出的B页面也dismiss了,从而返回到A页面.

解决方法:

既然找到原因,是根控制器的问题,我们现在就来改根控制器来解决这个问题

就是修改window.rootviewcontroller ,在present B 那里跳转改为更改window.rootviewcontroller

UIViewController *Bcontroller = [[UIViewController alloc]init];

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

appDelegate.window.rootViewController = Bcontroller;

[self presentViewController:Bcontroller animated:NO completion:nil];


返回的时候再更改 window.rootviewcontroller ,改回去

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

UIViewController *Acontroller = [[UIViewController alloc]init]; 

appDelegate.window.rootViewController = Acontroller;

你可能感兴趣的:(whose view is not in the window hierarchy!)