UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[self presentViewController:picker animated:YES completion:nil];
换成
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[delegate.window.rootViewController presentViewController:picker animated:YES completion:^{
}];
理论上是允许从一个控制器present到另外一个控制器,再从这个控制器present另外一个控制器.我在网上查了有个大神这样解释的:
一般来说我们呈现一个viewcontroller 里面的内容,经常采用的方式是用navigationcontroller与tabbarcontroller来管理视图控制器。在这种情况下,呈现的视图控制器都在一个app维护的控制器堆栈里面。
而有一种情况就是通过self.view addsubview:AviewController.view也可以呈现出某个视图控制器。这种情况虽然看上去跟 push的结果没什么不同,但是实际上这个被呈现的view的controller并没有在当前app的视图堆栈里,也就是所谓的
detachviewcontroller,如果你在这个分离之外的视图控制器里面做present 调用,就会出现上述问题。
所以判定是否为分离视图,就是看它是不是处在当前app的控制器堆栈里面。
显然app的 rootviewcontroller 当然是处于堆栈里,并且是堆栈最底层的视图控制器。所以这种解决方案在一定程度上是可行的。