iPad的模拟器罚款,但iPad上传图片时使用WKWebview崩溃的应用程序

背景和简短摘要

我正在使用WkWebview为了显示我的应用程序的网页。 我拥有它,以便您可以从相机或照片库中select一个图像。 但是,在select图像时,应用程序崩溃似乎存在问题。

眼镜

我在平板电脑上运行IOS 10.0.2,在模拟器上使用Swift 3运行IOS 10.0。我从XCode 8运行。

在模拟器上,当我尝试上传图片时,出现“错误”

我收到以下消息:

2016-10-19 02:15:36.150670 z4[31561:14708540] [Generic] Creating an image format with an unknown type is an error 

图像是好的,我可以用它来上传。 我认为这种行为很奇怪,但是我读到它与IOS上的内存pipe理有关

在平板电脑本身,我得到以下

 Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController (<UIAlertController: 0x151e80350>) of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.' 

该应用程序似乎在AppDelegate中崩溃。 我不知道如何去做他们的build议。 我也不知道这是一个更深层次的问题,还是我错过了一些非常简单的事情。

我和UIAlerts有关的代码

以下是我与UIAlertController相关的3个函数

  func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in completionHandler() })) self.popoverPresentationController?.sourceView = self.view self.popoverPresentationController?.sourceRect = self.view.bounds self.present(alertController, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet) alertController.addAction(UIAlertAction(title: "Yes", style: .default, handler: { (action) in completionHandler(true) })) alertController.addAction(UIAlertAction(title: "No", style: .default, handler: { (action) in completionHandler(false) })) self.popoverPresentationController?.sourceView = self.view self.popoverPresentationController?.sourceRect = self.view.bounds self.present(alertController, animated: true, completion: nil) } func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet) alertController.addTextField { (textField) in textField.text = defaultText } alertController.addAction(UIAlertAction(title: "Yes", style: .default, handler: { (action) in if let text = alertController.textFields?.first?.text { completionHandler(text) } else { completionHandler(defaultText) } })) alertController.addAction(UIAlertAction(title: "No", style: .default, handler: { (action) in completionHandler(nil) })) self.popoverPresentationController?.sourceView = self.view self.popoverPresentationController?.sourceRect = self.view.bounds self.present(alertController, animated: true, completion: nil) } 

我怎样才能处理这个exception,并解决这个问题,所以我的应用程序不会崩溃在我身上? 如果需要,我可以提供更多的细节和代码。 提前谢谢你的帮助。

你必须做一些小小的改变才能在iPad上工作。 我正在添加你的代码中缺less的行。

 self.popoverPresentationController = alertController.popoverPresentationController alertController.modalPresentationStyle = .Popover 

在你的3个函数中添加这两行代码。

请使用下面的Objective-C代码作为参考。 所以这可能是你的工作。

 - (void)showAlertWithTitle:(NSString *)title withMessage:(NSString *)message withStyle:(UIAlertControllerStyle) alertStyle andActions:(NSArray *)actions andSource:(UIView *)sourceView{ UIAlertController *alertController= [UIAlertController alertControllerWithTitle:title message:message preferredStyle:alertStyle]; for (UIAlertAction *action in actions) { [alertController addAction:action]; } UIWindow *alertWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; alertWindow.rootViewController = [[UIViewController alloc]init]; alertWindow.windowLevel = UIWindowLevelAlert + 1; [alertWindow makeKeyAndVisible]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { [alertController setModalPresentationStyle:UIModalPresentationPopover]; UIPopoverPresentationController *popPresenter = [alertController popoverPresentationController]; popPresenter.sourceView = sourceView; popPresenter.sourceRect = sourceView.bounds; } [alertWindow.rootViewController presentViewController:alertController animated:YES completion:nil]; 

}

 - (void)dismissAlertController{ UIWindow *topWindow = [UIApplication sharedApplication].windows.lastObject; [topWindow.rootViewController dismissViewControllerAnimated:YES completion: nil];} 

要使用上面的方法,下面是示例。

  __weak typeof(self) weakSelf = self; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { // Cancel button tappped. [weakSelf dismissAlertController]; }]; UIAlertAction *removeAction = [UIAlertAction actionWithTitle:@"Remove" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { [weakSelf dismissAlertController]; //Do your actions }]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [self showAlertWithTitle:@"Are you sure you want to remove?" withMessage:nil withStyle:UIAlertControllerStyleActionSheet andActions:@[removeAction,cancelAction]]; } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ [self showAlertWithTitle:@"Are you sure you want to remove?" withMessage:nil withStyle:UIAlertControllerStyleActionSheet andActions:@[removeAction,cancelAction] andSource:sender]; }