iOS之Modal情况下使用WebView使用系统相册

当在iOS应用中,一个通过presentViewController显示的NavigationController内的WebView尝试调用系统相册时,会出现问题。解决方案包括不使用presentViewController而改用push,或者重写UINavigationController的方法。在具体实现中,可以通过创建UINavigationController的类别或子类来修复此问题。

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

描述一下我今天遇到的bug情况:
1.app在Windows.rootViewController 下(rootViewController是一个NavigationController)push一个带WebView的Controller,WebView是打开网页有一个调用系统相册的页面,这个时候可以正常调用。
2.app在Windows.rootViewController之上通过presentViewController: animated: completion:加入一个NavigationController,这个NavigationController带一个WebView的Controller,webView上打开一个有调用系统相册的页面,这个时候调用系统相册出现

Warning: Attempt to present <UIImagePickerController: 0x1102c2a00> on <CustomNavigationController: 0x11020f600> whose view is not in the window hierarchy!

解决方法如下:
1.不使用presentViewController,全部用push
(显然这种方式是不现实的)
2.在你presentViewControoler要传入的控制器里重写

-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
    if ( self.presentedViewController)
    {
        [super dismissViewControllerAnimated:flag completion:completion];
    }
}

如我上面的情况我重写了一个UINavigationController+Ext类别
UINavigationController+Ext.m代码如下:

#import "UINavigationController+Ext.h"

@implementation UINavigationController (Ext)
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
    if ( self.presentedViewController)
    {
        [super dismissViewControllerAnimated:flag completion:completion];
    }
}

@end

这样就能很好的解决上面的问题了,但是最好不要使用类别,建议使用继承方式重写上面方法,然后app统一使用你新建的子类

参考资料:https://stackoverflow.com/questions/36457781/modal-uiwebview-and-camera-image-picker-issue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值