2016-03-14 32 views
6

我在這一個簡單的斯威夫特項目:的UIImagePickerController和觀點是不是在窗口層次

的ViewController一個class ViewController: UIViewController)提出的ViewController乙 - (class WebViewController: UIViewController, WKNavigationDelegate, CLLocationManagerDelegate, WKScriptMessageHandler)。

視圖控制器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時的,我基本上只是對整個屏幕上的網頁瀏覽器。

我遇到的問題是,如果用戶(同時在網頁上),點擊「文件上傳/文件選擇器」,我第一次看到這一點:

型公共過去了。商品不符合public.content或 public.data。如果您要導出新類型,請確保它 符合適當的父類型。 UICollectionViewFlowLayout的行爲未定義,因爲項目寬度必須小於UICollectionView的寬度減去 insets左右值,減去內容插入左右 值的寬度。

相關UICollectionViewFlowLayout實例是 < _UIAlertControllerCollectionViewFlowLayout:0x12e30f270>,它是 附接到; 動畫= {bounds.origin =; bounds.size =; position =; }; layer =; contentOffset:{0,0}; contentSize:{0,0}>收集 視圖佈局:< _UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>。

然後,如果用戶選擇從iOS選項列表「拍照或錄像」或「圖片庫」,我得到這個:

警告:試圖提出的UIImagePickerController:0x12d192200上 我.WebViewController:0x12e2883e0其視圖不在窗口 的層次結構中!

結果是:從來沒有出現

  1. 照片庫選擇器//相機應用。
  2. 的ViewController乙經歷動畫駁回,出於某種原因。

有沒有人有什麼建議?我試圖提供相關的代碼,但如果需要,我可以粘貼更多。謝謝。

- 更新--------

好了,所以更多的研究後,實際上是兩回事事情:

  1. 第一個錯誤是一個功能如何通過移動瀏覽器處理「文件選擇器」。 See here ...事情的宏偉計劃,沒什麼大不了的。

  2. 第二個錯誤Attempt to present UIImagePickerController... - 兩個更糟糕的 - 是醜陋的。

如果具有WKWebView一個的ViewController從另一個的ViewController呈現然後,在用戶試圖「選擇」的圖像(從庫或照相機)的iOS將試圖呈現UIImagePicker 您的WKWebView ViewController,這是你想要的。

不幸的是,由於我還不知道的原因,用戶試圖「挑選」圖片的行爲也會導致iOS解僱所呈現的視圖控制器......在這種情況下,您的WKWebView控制器:(因此,WKWebView的ViewController關閉,所以它不在窗口層次結構時,它試圖呈現UIImagePicker - 因此,錯誤。我的解決方案(這是很hacky,但適用於我的具體用例如下;我希望這可以幫助某人:

  1. 實例化WKWebView ViewController(ViewController乙
  2. 設置VC乙作爲應用程序的根視圖控制器
  3. 當前VC乙的ViewController甲
  4. 辭退VC甲

這實質上使得它如此的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) 
}) 
+0

我現在有同樣的情況。至於第一個問題:它只出現在模擬器上,但不出現在實際設備上。第二個問題通過https://stackoverflow.com/questions/37380333 – Jurasic

回答

0

如果您在viewDidLoad(){}功能做INT目前然後嘗試移動代碼到覆蓋viewDidAppear(animated: Bool) {}今天我有同樣的問題,並固定它。

+0

回答解決我有同樣的問題,但是這個解決方案沒有爲我解決它。 –

相關問題