Xamarin.Forms 警告:尝试使用 iOS 图像/手势识别器在其视图不在窗口层次结构中的 * 上呈现 *

Posted

技术标签:

【中文标题】Xamarin.Forms 警告:尝试使用 iOS 图像/手势识别器在其视图不在窗口层次结构中的 * 上呈现 *【英文标题】:Xamarin.Forms Warning: Attempt to present * on * whose view is not in the window hierarchy with iOS image/gesture recogniser 【发布时间】:2016-12-20 11:40:32 【问题描述】:

我有一个模态导航页面,其中包含一个类似于按钮的图像;

<Image Source ="share.png" HeightRequest="32" WidthRequest="32">
    <Image.GestureRecognizers>
        <TapGestureRecognizer Tapped="On_Share" />
    </Image.GestureRecognizers>
</Image>

以及背后的方法;

async void On_Share(object sender, EventArgs e)

    if (CrossConnectivity.Current.IsConnected)
    
        var message = "Share this";
        var title = "Share";
        await CrossShare.Current.Share(new ShareMessage  Text = message, Title = title, new ShareOptions  ExcludedUIActivityTypes = new[]  ShareUIActivityType.PostToFacebook  );
    
    else
    
        NoInternetLabel.IsVisible = true;
    
 

当我尝试单击共享图像/按钮时出现错误。我在 On_Share 方法的第一行设置了断点,它们没有被命中。

Warning: Attempt to present <UIActivityViewController: 0x141b60f70> on <Xamarin_Forms_Platform_ios_ModalWrapper: 0x1419a0920> whose view is not in the window hierarchy!

请注意,这在 android 中运行良好,我只在 iOS 中看到问题。我不确定发生了什么 - 当我单击图像时,我并没有试图呈现任何其他窗口或任何东西。无论如何,错误出现在进程到达 On_Share 方法的开头之前。我在这里错过了什么?

编辑:该方法现在确实受到影响,但我仍然遇到错误。它一定是试图发送共享表并且失败了......

【问题讨论】:

【参考方案1】:

Share 插件最终出现问题 - 我们通过使部分代码递归解决了这个问题。

以前的 GetVisibleViewController 是这样的;

UIViewController GetVisibleViewController()

    var rootController = UIApplication.SharedApplication.KeyWindow.RootViewController;

    if (rootController.PresentedViewController == null)
        return rootController;

    if (rootController.PresentedViewController is UINavigationController)
    
        return ((UINavigationController)rootController.PresentedViewController).VisibleViewController;
    

    if (rootController.PresentedViewController is UITabBarController)
    
        return ((UITabBarController)rootController.PresentedViewController).SelectedViewController;
    

    return rootController.PresentedViewController;

而它需要循环查找顶部的 UIViewController;

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

我已经在github 上提出了这个问题并提交了一个拉取请求

【讨论】:

以上是关于Xamarin.Forms 警告:尝试使用 iOS 图像/手势识别器在其视图不在窗口层次结构中的 * 上呈现 *的主要内容,如果未能解决你的问题,请参考以下文章

无法调试在 Xamarin.Forms 中制作的 IOS 应用程序

Xamarin.Forms + 本机库 OpenCV

Xamarin.Forms iOS 依赖服务中的触觉反馈崩溃

在 xamarin.forms (ios) 中启动演示应用程序时出错

无法构建 Xamarin.Forms iOS 项目

在 Xamarin.Forms 中使用 ToptabbedPage 时出现意外的白色按钮