iOS 8 SDK:模态UIWebView和相机/图像选择器

yon*_*ytu 36 objective-c uiwebview uiimagepickercontroller ios ios8

我发现,在编译iOS 8(并在iOS 8中运行)时,UIWebView如果在UIWebView模式中呈现的视图控制器中,则无法显示相机/图像选择器.它在视图控制器中直接从窗口"悬挂" rootViewController或从其推出的视图控制器中工作没有问题.

测试应用程序可以在https://dl.dropboxusercontent.com/u/6214425/TestModalWebCamera.zip找到,但我将在下面进行描述.

我的测试应用程序(使用故事板构建,但实际应用程序不使用它们)有两个视图控制器(非原始命名ViewControllerViewController2).ViewController包含在UINavigationController根视图控制器中.ViewController包含一个UIWebView(工作正常),一个"显示"("推")的按钮ViewController2,以及一个UIBarButtonItem模态呈现的按钮ViewController2.ViewController2有另一个UIWebView在"推"时工作但在"提出"时不工作.

双方ViewControllerViewController2装载有:

- (void)viewDidLoad {
  [super viewDidLoad];

  [self.webView loadHTMLString:@"<input type=\"file\" accept=\"image/*;capture=camera\">" baseURL:nil];
}
Run Code Online (Sandbox Code Playgroud)

当尝试使用模态UIWebViewXcode在控制台中打印以下内容并解除应用模式:

Warning: Attempt to present <UIImagePickerController: 0x150ab800> on <ViewController2: 0x14623580> whose view is not in the window hierarchy!
Run Code Online (Sandbox Code Playgroud)

我目前的理论是,在改变UIActionSheetUIAlertController有可能产生这种情况,但它是非常难以证明.为了以防万一,我将与Apple一起打开雷达.

有人找到了相同的情况和一些解决方法吗?

see*_*ble 47

我发现在iOS 8.0.2中iPad似乎没有那个bug,但iPhone仍然存在.

但是,在包含uiwebview的视图控制器中覆盖以下内容

-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
Run Code Online (Sandbox Code Playgroud)

并检查有一个presentViewController似乎工作.

但需要检查副作用

#import "UiWebViewVC.h"

@interface UiWebViewVC ()

@property (weak, nonatomic) IBOutlet UIWebView *uiwebview;

@end

@implementation UiWebViewVC

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"http://html5demos.com/file-api-simple"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    self.uiwebview.scalesPageToFit = YES;

    [self.uiwebview loadRequest:request];
}


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


@end
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我.但是请记住,如果你在UINavigationController中展示你的自定义UIWebViewController(或WKWebViewController),请记住这需要转到那里.所以只需创建一个UINavigationController的子类,然后将代码转储到那里. (12认同)
  • uiwebview使uialertcontroller在uiwebviewviewcontroller上显示以显示相机/现有/取消.当用户选择选项时,uialertcontroller意味着被解雇并且uuiimagepickercontroller被呈现.然而,对uialertcontroller的解雇似乎开了两次.第一次是好的,因为presentviewcontroller = uialertcontroller,但第二次presentviewcontroller属性为nil,这导致dismissviewcontrolleranimated方法杀死webviewviewcontroller这是问题,我现在测试这个案例 (6认同)

Art*_*tov 7

我在iOS 9上遇到同样的问题.尝试添加ivar'_flag',然后使用UIWebView在视图控制器中覆盖此方法

#pragma mark - Avoiding iOS bug

- (UIViewController *)presentingViewController {

    // Avoiding iOS bug. UIWebView with file input doesn't work in modal view controller

    if (_flagged) {
        return nil;
    } else {
       return [super presentingViewController];
    }
}

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

    // Avoiding iOS bug. UIWebView with file input doesn't work in modal view controller

    if ([viewControllerToPresent isKindOfClass:[UIDocumentMenuViewController class]]
    ||[viewControllerToPresent isKindOfClass:[UIImagePickerController class]]) {
        _flagged = YES;
    }

    [super presentViewController:viewControllerToPresent animated:flag completion:completion];
}

- (void)trueDismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {

    // Avoiding iOS bug. UIWebView with file input doesn't work in modal view controller

    _flagged = NO;
    [self dismissViewControllerAnimated:flag completion:completion];
}
Run Code Online (Sandbox Code Playgroud)

这对我很好