UIImagePickerController&视图不在窗口层次结构

时间:2016-03-14 22:47:56

标签: ios swift uivewcontroller

我有一个简单的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 =;   位置=; }; layer =; contentOffset:{0,0}; contentSize:{0,0}>采集   视图布局:< _UIAlertControllerCollectionViewFlowLayout:   0x12e30f270>

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

  

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

结果是:

  1. 照片库选择器//相机应用程序永远不会出现。
  2. ViewController B由于某种原因经历动画解雇。
  3. 有没有人有任何建议?我试图提供相关代码,但如果需要我可以粘贴更多代码。谢谢。

    - 更新--------

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

    1. 第一个错误是"文件选择器"由移动浏览器处理。 See here ......宏伟的计划,不是什么大不了的事。

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

    3. 如果带有WKWebView的ViewController是从 另一个 ViewController呈现的,那么当用户尝试"选择"一个图像(来自图书馆或相机),iOS将尝试从你的WKWebView ViewController呈现UIImagePicker

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

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

      1. 实例化WKWebView ViewController( ViewController B
      2. VC B 设置为应用程序的根视图控制器
      3. 来自 ViewController A
      4. VC B
      5. 解除 VC A
      6. 这实际上使得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)
        })
        

1 个答案:

答案 0 :(得分:0)

如果你当前在viewDidLoad(){}函数中使用int,那么尝试将代码移到覆盖viewDidAppear(animated: Bool) {}我今天遇到了同样的问题并修复了它。