2016-12-20 16 views
0

ボタンのように動作する画像を持つモーダルナビゲーションページがあります。Xamarin.Forms警告:iOS画像/ジェスチャ認識子でウィンドウ階層に表示されない* on *を表示しようとしました

<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メソッドの先頭に達する前に、エラーが表示されます。私はここで何が欠けていますか?

EDIT:このメソッドは現在ヒットしていますが、まだエラーが発生しています。共有シートを送信しようとしているに違いありません。

答えて

4

最後に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

にプルリクエストを送信しました