我有一个简单的 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,其视图不在窗口层次结构中!
结果是:
- 照片库选择器//相机应用程序永远不会出现。
- 由于某种原因,ViewController B 经历了动画关闭。
有没有人有什么建议?我试图提供相关代码,但如果需要,我可以粘贴更多。谢谢你。
- 更新 - - - -
好的,所以经过更多研究,实际上有两个不同的事情发生:
第一个错误是移动浏览器如何处理“文件选择器”的函数。 看这里... 宏伟的计划,没什么大不了的。
第二个错误
Attempt to present UIImagePickerController...
——两者中更使人衰弱的——更丑陋。
如果带有 WKWebView 的 ViewController 是从另一个ViewController 呈现的,那么当用户尝试“挑选”图像(从库或相机)时,iOS 将尝试从WKWebView ViewController 呈现 UIImagePicker,这就是你想要的。
不幸的是,由于我还不知道的原因,用户试图“挑选”图像的行为也会导致 iOS 关闭呈现的视图控制器......在这种情况下,它是你的 WKWebView 控制器 :( 因此,WKWebView ViewController 关闭,因此当它尝试呈现 UIImagePicker 时它不在窗口层次结构中 - 因此出现错误。
我的解决方案(这很老套,但适用于我的特定用例)如下;我希望这可以帮助别人:
- 实例化 WKWebView ViewController ( ViewController B )
- 将VC B设置为应用的根视图控制器
- 从ViewController A 呈现VC B
- 解雇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)
})