iOS 关于Presenting view controllers on detached view controllers is discouraged的警告

当在iOS应用中使用`presentViewController:animated:completion:`时,如果目标控制器不在当前控制器堆栈中,会出现'Presenting view controllers on detached view controllers is discouraged'警告。该文介绍了问题原因及解决方案,即通过获取AppDelegate的rootViewController来呈现视图控制器,避免警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 当然是处于堆栈里,并且是堆栈最底层的视图控制器。所以这种解决方案在一定程度上是可行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值