2016-03-14 2 views
6

У меня есть простой Swift проект, в котором:UIImagePickerController и вид не в иерархии окон

ViewController А (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 представлен, я в основном просто иметь веб-браузер на весь экран.

Проблема я бегу в том, что, если пользователь (в то время как на веб-странице) щелкает «Файл Upload Picker/Файл», первым я вижу это:

Зачет в типе общества. элемент не соответствует ни public.content, ни public.data. Если вы экспортируете новый тип, убедитесь, что он соответствует соответствующему типу родителя. поведение UICollectionViewFlowLayout не определено, потому что ширина элемента должна быть меньше ширины UICollectionView за вычетом раздела вставки левого и правого значений, минус вставки содержимого слева и справа значений.

Соответствующий экземпляр UICollectionViewFlowLayout является < _UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>, и он прикреплен к; animations = {bounds.origin =; bounds.size =; position =; }; layer =; contentOffset: {0, 0}; contentSize: {0, 0}> коллекция посмотреть раскладку: < _UIAlertControllerCollectionViewFlowLayout: 0x12e30f270>.

Затем, если пользователь выбирает "Сфотографировать или видео" или "Photo Library" из списка IOS вариантов, я получаю это:

Предупреждение: Попытка представить UIImagePickerController: 0x12d192200 на Мои .WebViewController: 0x12e2883e0, чей вид отсутствует в окне иерархии!

В результате: никогда не появляется

  1. Фото библиотека сборщика // приложение камеры.
  2. ViewController B по какой-то причине подвергается анимированным увольнениям.

Есть ли у кого-нибудь предложения? Я попытался предоставить соответствующий код, но при необходимости могу вставить больше. Спасибо.

- ОБНОВЛЕНИЕ --------

Итак, после дополнительных исследований, есть на самом деле два отдельных вещей происходит:

  1. Первая ошибка является функцией о том, как «сборщик файлов» обрабатывается мобильным браузером. See here ... великая схема вещей, не большая сделка.

  2. Вторая ошибка Attempt to present UIImagePickerController... - более изнурительная из двух - более уродливая.

Если ViewController с WKWebView представлен от другого ViewController затем, после того как пользователь пытается «выбрать» изображение (из библиотеки или камеры), IOS будет пытаться представить UIImagePicker от ваш WKWebView ViewController, который вы хотите.

К сожалению, по какой-то причине я еще не знаю, что действие пользователя, пытающегося «выбрать» изображение, также заставляет iOS отклонять представленный контроллер представления ... который в данном случае является вашим контроллером WKWebView :(Таким образом, WKWebView ViewController отклоняется, поэтому он не находится в иерархии окон, когда пытается представить UIImagePicker - следовательно, ошибка.

Мое решение (которое довольно хакерское, но работает для моего частности, вариант использования), заключается в следующем, я надеюсь, что это помогает кто-то:

  1. Инстанцировать в WKWebView ViewController (ViewController B)
  2. Набор VC B в качестве контроллера представления Корневой приложения
  3. Present VC B из 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) 
}) 
+0

У меня такая же ситуация прямо сейчас. Что касается первой проблемы: она появляется только на симуляторе, но не на самом устройстве. Вторая проблема решена путем ответа на https://stackoverflow.com/questions/37380333 – Jurasic

ответ

0

Если вы делаете Int в viewDidLoad(){} функции в настоящее время, то попробуйте переместить код в переопределение viewDidAppear(animated: Bool) {} Я была такая же проблема сегодня и установил ее.

+0

У меня такая же проблема, но это решение не исправило ее для меня. –

Смежные вопросы