我发现,在针对 iOS 8 进行编译(并在 iOS 8 中运行)时,如果 UIWebView
位于以模态方式呈现的 View Controller 。它在直接从窗口 rootViewController
“挂起”的 View Controller 或从它推送的 View Controller 中正常工作。
可以在https://dl.dropboxusercontent.com/u/6214425/TestModalWebCamera.zip 找到测试应用程序但我会在下面描述。
我的测试应用程序(使用 Storyboard构建,但实际应用程序不使用它们)有两个 View Controller (未最初命名为 ViewController
和 ViewController2
)。 ViewController
包含在作为 Root View Controller 的 UINavigationController
中。 ViewController
包含一个 UIWebView
(工作正常)、一个“显示”(“推送”)的按钮 ViewController2
和一个 UIBarButtonItem
以模态方式呈现 ViewController2
。 ViewController2
有另一个 UIWebView
,它在“推送”时有效,但在“呈现”时无效。
ViewController
和 ViewController2
都加载了:
- (void)viewDidLoad {
[super viewDidLoad];
[self.webView loadHTMLString:@"<input type=\"file\" accept=\"image/*;capture=camera\">" baseURL:nil];
}
当尝试使用模态 UIWebView
时,Xcode 在控制台中打印以下内容并关闭应用模态:
Warning: Attempt to present <UIImagePickerController: 0x150ab800> on <ViewController2: 0x14623580> whose view is not in the window hierarchy!
我目前的理论是 UIActionSheet
到 UIAlertController
的变化可能导致了这种情况,但很难证明。以防万一,我会和 Apple 一起开雷达。
是否有人发现了相同的情况和解决方法?
最佳答案
我发现在 iOS 8.0.2 中 iPad 似乎没有这个错误,但 iPhone 仍然有。
但是,在包含 uiwebview 的 View Controller 中覆盖以下内容
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
并且检查是否存在 presentedViewController 似乎有效。
但需要检查副作用
#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
关于iOS 8 SDK : modal UIWebView and camera/image picker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25942676/