UIAlert disappears when the page is change

96 views Asked by At

I have to show an UI alert dialog in the Appdelegate and MainAcvitivy in Xamarin.Forms. For android, there is no problem but for ios it does not work properly.

First of all, if I use UIAlertView, it works without problem.

Task.Run(async () =>
            {
                await Device.InvokeOnMainThreadAsync(() =>
                {
                    var alertView = new UIAlertView("Title", $"Message", null, "OK") { UserInteractionEnabled = true };
                    alertView.Clicked += (sender, args) =>
                    {
                        File.Delete(errorFilePath);
                    };
                    alertView.Show();

                }).ConfigureAwait(false);

            }).ConfigureAwait(false);

but unfortunately UIAlertView is deprecated. That's why I use UIViewController.

Nevertheless I can see the alert around 0.5 second in the splash screen but after that, I show my main page and the alert is gone.

Here is the code

            Task.Run(async () =>
        {
            await Device.InvokeOnMainThreadAsync(() =>
            {
              UIAlertController alertView = UIAlertController.Create("Title", $"Message", UIAlertControllerStyle.Alert);
                                    
              alertView.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, (action) => File.Delete(errorFilePath)));

              TopViewController.PresentViewController(alertView, true, null);
              //var appDelegate = (AppDelegate)UIApplication.SharedApplication.Delegate;
              //appDelegate.Window.RootViewController.PresentViewController(alertView, true, null);

            }).ConfigureAwait(false);

        }).ConfigureAwait(false);

and here is my TopViewContoller

    public static UIViewController TopViewController
    {
        get
        {
            UIApplication.SharedApplication.KeyWindow.WindowLevel = UIWindowLevel.Alert +1;
            UIApplication.SharedApplication.KeyWindow.BackgroundColor = UIColor.Clear;
            UIApplication.SharedApplication.KeyWindow.UpdateConstraints();
            
            UIApplication.SharedApplication.KeyWindow.MakeKeyAndVisible();

            UIApplication.SharedApplication.KeyWindow.RootViewController.UpdateViewConstraints();
            
            return TopViewControllerWithRootViewController(UIApplication.SharedApplication.KeyWindow.RootViewController);
        }
    }
1

There are 1 answers

0
ColeX On BEST ANSWER

What does the code look like in method TopViewControllerWithRootViewController ?

Could you just replace TopViewController with UIApplication.SharedApplication.KeyWindow.RootViewController and try again ?

And why you place the code into a Task , it is unnecessary .

Remove the outer Task and just try the following code ,it works fine on my side .

UIAlertController alertView = UIAlertController.Create("Title", $"Message", UIAlertControllerStyle.Alert);
                                    
alertView.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, (action) => File.Delete(errorFilePath)));

UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(alertView, true, null);