8

我有一个简单的 Swift 项目,其中:

ViewController A ( class ViewController: UIViewController) 表示ViewController B -- ( class WebViewController: UIViewController, WKNavigationDelegate, CLLocationManagerDelegate, WKScriptMessageHandler)。

ViewController B 本质上只是一个 WKWebView,这是它的viewDidLoad()

let contentController = WKUserContentController();
contentController.addScriptMessageHandler(
    self,
    name: "eventHandler"
)

let config = WKWebViewConfiguration()
config.userContentController = contentController

webView = WKWebView(frame: CGRectZero, configuration: config)
webView.navigationDelegate = self
webView.allowsBackForwardNavigationGestures = false
view = webView

所以,当 ViewController B 出现时,我基本上只是在整个屏幕上都有一个 Web 浏览器。

我遇到的问题是,如果用户(在网页上)单击“文件上传/文件选择器”,首先我会看到:

传入的类型 public.item 不符合 public.content 或 public.data。如果您要导出新类型,请确保它符合适当的父类型。未定义 UICollectionViewFlowLayout 的行为,因为项目宽度必须小于 UICollectionView 的宽度减去部分插入左右值,减去内容插入左右值。

相关的 UICollectionViewFlowLayout 实例是 <_UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>,它附加到 ; 动画 = { bounds.origin=; bounds.size=; 位置=; }; 层 = ; 内容偏移:{0, 0}; contentSize: {0, 0}> 集合视图布局:<_UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>。

然后,如果用户从 iOS 选项列表中选择“拍摄照片或视频”或“照片库”,我会得到:

警告:尝试在 My.WebViewController: 0x12e2883e0 上呈现 UIImagePickerController: 0x12d192200,其视图不在窗口层次结构中!

结果是:

  1. 照片库选择器//相机应用程序永远不会出现。
  2. 由于某种原因,ViewController B 经历了动画关闭。

有没有人有什么建议?我试图提供相关代码,但如果需要,我可以粘贴更多。谢谢你。

- 更新 - - - -

好的,所以经过更多研究,实际上有两个不同的事情发生:

  1. 第一个错误是移动浏览器如何处理“文件选择器”的函数。 看这里... 宏伟的计划,没什么大不了的。

  2. 第二个错误Attempt to present UIImagePickerController...——两者中更使人衰弱的——更丑陋。

如果带有 WKWebView 的 ViewController 是从另一个ViewController 呈现的,那么当用户尝试“挑选”图像(从库或相机)时,iOS 将尝试WKWebView ViewController 呈现 UIImagePicker,这就是你想要的。

不幸的是,由于我还不知道的原因,用户试图“挑选”图像的行为也会导致 iOS 关闭呈现的视图控制器......在这种情况下,它是你的 WKWebView 控制器 :( 因此,WKWebView ViewController 关闭,因此当它尝试呈现 UIImagePicker 时它不在窗口层次结构中 - 因此出现错误。

我的解决方案(这很老套,但适用于我的特定用例)如下;我希望这可以帮助别人:

  1. 实例化 WKWebView ViewController ( ViewController B )
  2. VC B设置为应用的根视图控制器
  3. ViewController A 呈现VC B
  4. 解雇VC A

这基本上使得 WKWebView 不能被解雇,回避问题。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("Browser") as! WebViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc

self.presentViewController(vc, animated: false, completion: { () -> Void in
    self.dismissViewControllerAnimated(false, completion: nil)
})
4

1 回答 1

1

如果您当前正在执行 int intviewDidLoad(){}函数,请尝试将代码移动到覆盖viewDidAppear(animated: Bool) {}中,我今天遇到了同样的问题并修复了它。

于 2016-06-15T21:12:06.323 回答