草庐IT

c# - UIImagePickerController 出现 "Attempt to present Xamarin_Forms_Platform_iOS_ModalWrapper whose view is not in the window hierarchy"错误

coder 2023-09-10 原文

我有一个基于 Xamarin.Forms 的应用程序,它在 Android 和 iOS 上运行。现在,我正在实现从相机胶卷中选择图像并将其上传到我们的服务器的功能。因此,我正在为发生错误的 iOS 编写特定于平台的代码。

我正在从特定于平台的 iOS 渲染器调用 UIImagePickerController。它正常打开。但是,当在 UIImagePickerController 中点击图像时,除了 Visual Studio 在调试控制台中显示一条消息外,什么也没有发生:

“警告:尝试在 Xamarin_Forms_Platform_iOS_PlatformRenderer:0x153ead6a0 上呈现 Xamarin_Forms_Platform_iOS_ModalWrapper:0x155a7ed00,其 View 不在窗口层次结构中!”

我用谷歌搜索,发现有人在编写一个名为“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);
}

最佳答案

我们遇到了类似的问题,这是我们得出的结论:

    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;
    }

关于c# - UIImagePickerController 出现 "Attempt to present Xamarin_Forms_Platform_iOS_ModalWrapper whose view is not in the window hierarchy"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56187423/

有关c# - UIImagePickerController 出现 "Attempt to present Xamarin_Forms_Platform_iOS_ModalWrapper whose view is not in the window hierarchy"错误的更多相关文章

随机推荐