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

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= ; position= ;}; 图层 = ; 内容偏移量:{0, 0};内容大小:{0, 0}> 集合视图布局:<_UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>。

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

警告:尝试在 My.WebViewController: 0x12e2883e0 上呈现 UIImagePickerController: 0x12d192200,但其视图不在窗口层次结构中! 结果是: 1. 照片库选择器/相机应用程序从未出现。 2. 某种原因下,ViewController B 经历了一个动画消失。 有人有什么建议吗?我试图提供相关代码,但如果需要,我可以粘贴更多。谢谢。 -- 更新 -------- 好的,经过更多研究,实际上有两个不同的问题: 1. 第一个错误是由移动浏览器处理“文件选择器”的方式决定的。 请参见此处...大局来看,这并不重要。 2. 第二个错误“尝试在UIImagePickerController上呈现...”——这两个错误中更严重的一个——更加丑陋。
如果使用带有WKWebView的ViewController从另一个ViewController呈现,则在用户尝试“选择”图像(从库或相机)时,iOS将尝试从您的WKWebView ViewController中呈现UIImagePicker,这正是您想要的。不幸的是,由于某种原因,用户尝试“选择”图像的行为还会导致iOS关闭已呈现的视图控制器,而在这种情况下,它是您的WKWebView控制器:( 因此,WKWebView ViewController被解除,因此在尝试呈现UIImagePicker时它不在窗口层次结构中,因此出现错误。我的解决方案(非常hacky,但适用于我特定的用例)如下;希望这能帮助某些人:1. 实例化WKWebView ViewController(ViewController B)2. 将VC B设置为应用程序的根视图控制器3. 从ViewController A呈现VC B4. 解雇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)
})

我现在也遇到了同样的情况。至于第一个问题:它只出现在模拟器上,而不是实际设备上。第二个问题已经通过 https://dev59.com/iZffa4cB1Zd3GeqP507S 的答案解决了。 - Jurasic
1个回答

1
如果您目前在viewDidLoad(){}函数中执行int操作,请尝试将代码移动到覆盖viewDidAppear(animated: Bool) {}的函数中。我今天遇到了同样的问题,这样做解决了它。

我有同样的问题,但是这个解决方案对我没有起作用。 - Jorg B Jorge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接