Ошибка «Попытка представить Xamarin_Forms_Platform_iOS_ModalWrapper, чье представление не находится в иерархии окон» с помощью UIImagePickerController

У меня есть приложение на основе Xamarin.Forms, которое работает на Android и iOS. Прямо сейчас я реализую функцию выбора изображений с камеры и загрузки их на наш сервер. Поэтому я пишу специфичный для платформы код для iOS, где и происходит ошибка.

Я вызываю UIImagePickerController из платформенного рендерера для iOS. Открывается нормально. Но при нажатии на изображение в UIImagePickerController ничего не происходит, кроме Visual Studio, показывающего сообщение в консоли отладки:

«Предупреждение. Попытка представить Xamarin_Forms_Platform_iOS_ModalWrapper: 0x155a7ed00 на Xamarin_Forms_Platform_iOS_PlatformRenderer: 0x153ead6a0, чье представление не находится в иерархии окон!»

Я гуглил и нашел, что кто-то пишет функцию «GetVisibleViewController», которую я адаптировал к своему проекту (вы можете увидеть это ниже). На ViewController, который возвращает эта функция, я вызываю метод PresentModalViewController (). К сожалению, это тоже не работает. Невозможно выбрать фотографию.

private void ChoosePhoto() { _imagePicker = new UIImagePickerController() { SourceType = UIImagePickerControllerSourceType.PhotoLibrary, MediaTypes = new string[] { UTType.Image } }; _imagePicker.FinishedPickingMedia += delegate (object sender, UIImagePickerMediaPickedEventArgs e) { var fileName = eopAppLibrary.Tools.GetTimestampJpegFileName("ScanToEop_iOS"); var jpegImageData = e.OriginalImage.AsJPEG(); var jpegBytes = jpegImageData.ToArray(); Events.RaiseFilePreviewNeeded(this, jpegBytes, fileName); }; _imagePicker.Canceled += delegate (object sender, EventArgs e) { _imagePicker.DismissModalViewController(true); }; var viewController = GetVisibleViewController(); viewController.PresentModalViewController(_imagePicker, true); } 
 UIViewController GetVisibleViewController(UIViewController controller = null) { controller = controller ?? UIApplication.SharedApplication.KeyWindow.RootViewController; if (controller.PresentedViewController == null) { return controller; } if (controller.PresentedViewController is UINavigationController) { return ((UINavigationController)controller.PresentedViewController).VisibleViewController; } if (controller.PresentedViewController is UITabBarController) { return ((UITabBarController)controller.PresentedViewController).SelectedViewController; } return GetVisibleViewController(controller.PresentedViewController); } 

Всего 1 ответ


У нас была похожая проблема, и вот что мы придумали:

    var topViewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
    var controllerToPresentWith = topViewController.VisibleViewController();
    controllerToPresentWith.PresentModalViewController(_imagePicker, true);

а потом

    ...
    public static UIViewController VisibleViewController(this UIViewController controller)
    {
        if (controller == null)
            return null;

        if (controller is UINavigationController navController)
        {
            return navController.VisibleViewController();
        }
        else if (controller is UITabBarController tabController)
        {
            tabController.SelectedViewController?.VisibleViewController();
        }
        else
        {
            var vc =  controller.PresentedViewController?.VisibleViewController();
            if (vc != null)
                return vc;
        }
        return controller;
    }

Есть идеи?

10000