yonosoytu yonosoytu - 4 months ago 178
iOS Question

iOS 8 SDK: modal UIWebView and camera/image picker

I have found that, when compiling for iOS 8 (and running in iOS 8), a

UIWebView
cannot show the camera/image picker if the
UIWebView
is in a view controller presented modally. It works without problem in view controllers directly “hanging” from the window
rootViewController
or view controllers pushed from it.

The test application can be found at https://dl.dropboxusercontent.com/u/6214425/TestModalWebCamera.zip but I will describe it below.

My test application (built with storyboards, but the real application doesn’t use them) has two view controllers (unoriginally named
ViewController
and
ViewController2
).
ViewController
is contained in a
UINavigationController
which is the root view controller.
ViewController
contains a
UIWebView
(works OK), a button that “shows” (“pushes”)
ViewController2
, and a
UIBarButtonItem
which modally presents
ViewController2
.
ViewController2
has another
UIWebView
which works when “pushed” but not when “presented”.

Both
ViewController
and
ViewController2
are loaded with:

- (void)viewDidLoad {
[super viewDidLoad];

[self.webView loadHTMLString:@"<input type=\"file\" accept=\"image/*;capture=camera\">" baseURL:nil];
}


When trying to use the modal
UIWebView
Xcode prints the following in the console and dismisses the app modal:

Warning: Attempt to present <UIImagePickerController: 0x150ab800> on <ViewController2: 0x14623580> whose view is not in the window hierarchy!


My current theory is that the changes in
UIActionSheet
to
UIAlertController
might have produced this situation, but it’s quite hard to prove. I will open a Radar with Apple, just in case.

Has someone found the same situation and some workaround?

Answer

I found that in iOS 8.0.2 iPad does not seem to have that bug but iPhone still does.

However, overriding following in the view controller containing the uiwebview

-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion

And checking that there is a presentedViewController seems to work.

But need to check side effects

#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
Comments