简体   繁体   中英

Monotouch interactivePopGestureRecognizer and Navigation.popasync() blank view

I just noticed a odd behavior when using the interactivePopGestureRecognizer to go back in my app.

Case scenario:

1) User Drags view from left to right he goes back one view "interactivePopGestureRecognizer". 2) User swipes up or down "await Navigation.PopAsync(false);" is called and user goes back one view. 3) if User does action "1" and then calls a new view and tries to go-back using action 2 a blank view is displayed.

This error is only appearing if the user uses action 1 and then tries to use action 2; app works fine if action 1 is never used or if only action 1 is used, no both.

I am using Xamarin.Forms and I tried to used "interactivePopGestureRecognizer.enabled = false", but I get an error every-time I tried. is there a difference between the two back navigations?

-------------UPDATE----------

After reading a lot and looking in the internet I found out that ~interactivePopGestureRecognizer.enabled = false only works if you use it inside the ~ViewWillAppear I created a custom renderer that applies this to every tableView in my app. I would still want to figure out why is the back swipe acting this way.

----UPDATE 2--- Just pressing the back button and then trying to call navigation.popasync is giving me a blank page too. this seems to be an error between Xamarin.Navigation and the iOS back function.

Page:

MessagingCenter.Subscribe<string>(this, "UpSwipe", async (sender) =>
        {
            try
            {

                //await Navigation.PopAsync(false);
                Navigation.RemovePage(this);
            }
            catch (Exception e)
            { 
                await DisplayAlert("IsLoading", e.ToString(), "OK");
            }


        });

        MessagingCenter.Subscribe<string>(this, "DownSwipe", async (sender) =>
        {
            try
            {
                //await Navigation.PopAsync(false);
                Navigation.RemovePage(this);
            }
            catch (Exception e)
            { 
                await DisplayAlert("IsLoading", e.ToString(), "OK");
            }
        });

Renderer:

private void UpdateUp()
    {
        // Insert view of DetailLeft element into subview
        // Add button to open Detail to parent navbar, if not yet there
        // Add gesture recognizer for left swipe
        //Console.WriteLine ("Left swipe");
        if (!buttons[2].Selected && !buttons[1].Selected)
        {

            MessagingCenter.Send("Swiped Up", "UpSwipe");

        }

    }

    private void UpdateDown()
    {
        // Insert view of DetailLeft element into subview
        // Add button to open Detail to parent navbar, if not yet there
        // Add gesture recognizer for left swipe
        //Console.WriteLine ("Left swipe");
        if (!buttons[2].Selected && !buttons[1].Selected)
        {
            MessagingCenter.Send("Swiped Down", "DownSwipe");
        }

    }

After hours of debugging I fixed my issue by adding a return statement inside my renderer. I was checking and adding some gestureRecognizers in my renderer so a return was not needed until this bug came out.

protected override void OnElementChanged (ElementChangedEventArgs<LRMasterDetailPage> e)
    {
        base.OnElementChanged (e);

        if (e.OldElement != null)
        {
            return;
        }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM