UIImagePickerController和视图不在窗口层次结构中

Dan*_*Dan 7 ios uivewcontroller swift

我有一个简单的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
Run Code Online (Sandbox Code Playgroud)

因此,当ViewController B出现时,我基本上只在整个屏幕上有一个Web浏览器.

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

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

相关的UICollectionViewFlowLayout实例是<_UIAlertControllerCollectionViewFlowLayout:0x12e30f270>,它附加到; 动画= {bounds.origin =; bounds.size =; 位置=; }; layer =; contentOffset:{0,0}; contentSize:{0,0}>集合视图布局:<_ UIAlertControllerCollectionViewFlowLayout:0x12e30f270>.

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

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

结果是:

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

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

- 更新--------

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

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

  2. 第二个错误Attempt to present UIImagePickerController...- 两个人更加衰弱 - 更加丑陋.

如果具有WKWebView的ViewController从另一个 ViewController 呈现,那么当用户试图"选择"图像(来自库或相机)时,iOS将尝试您的WKWebView ViewController 呈现UIImagePicker ,这就是您想要的.

不幸的是,由于我还不知道的原因,用户试图"挑选"图像的行为也会导致iOS解雇所呈现的视图控制器......在这种情况下,它是您的WKWebView控制器:(如此,WKWebView ViewController解散,因此当它试图呈现UIImagePicker时它不在窗口层次结构中 - 因此,错误.

我的解决方案(非常hacky,但适用于我的特定用例),如下所示; 我希望这可以帮助别人:

  1. 实例化WKWebView ViewController(ViewController B)
  2. VC B设置为应用程序的根视图控制器
  3. VC乙ViewController中甲
  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)
})
Run Code Online (Sandbox Code Playgroud)

Tar*_*epp 1

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