xamarin.ios НЕ ОТКЛЮЧАЙТЕ UIAlertController, если щелкнуть за его пределами - PullRequest
0 голосов
/ 10 июня 2019

Я работаю в xamarin.forms проекте, и я застрял в проблеме.

Я хочу, чтобы основной экран оставался включенным всякий раз, когда отображается UIAlertController (в терминах Android Toast). Здесь для меня важны обе вещи.

При отображении предупреждения кнопки на фоне должны быть активными. А поскольку необходимо показать важное сообщение, предупреждение также должно появляться параллельно в течение заданного времени.

В Android Toast не мешает взаимодействию с пользователем на главном экране. Могу ли я иметь такую ​​же рабочую вещь в iOS?

Вот что я попробовал в моей службе зависимостей.

void ShowAlert(string message, double seconds)
        {
            try
            {
                if (alert == null && alertDelay == null)
                {
                    alertDelay = NSTimer.CreateScheduledTimer(seconds, (obj) =>
                    {
                        Device.BeginInvokeOnMainThread(() =>
                        {
                           DismissMessage();
                        });
                    });

                    Device.BeginInvokeOnMainThread(() =>
                    {
                        try
                        {
                            alert = UIAlertController.Create("", message, UIAlertControllerStyle.Alert);
                            alert.View.UserInteractionEnabled = true;

                            topViewControllerWithRootViewController(UIApplication.SharedApplication.KeyWindow.RootViewController).PresentViewController(alert, true, () =>
                            {
                                UITapGestureRecognizer tap = new UITapGestureRecognizer(() => { });   // I have tried this but nothing happens
                                alert.View.Superview.Subviews[0].AddGestureRecognizer(tap);
                            });
                        }
                        catch (Exception ex)
                        {
                            var Error = ex.Message;
                        }
                    });
                }
            }
            catch (Exception ex)
            {
                var Error = ex.Message;
            }
        }

        void DismissMessage()
        {
            if (alert != null)
            {
                alert.DismissViewController(true, null);
                alert = null;
            }
            if (alertDelay != null)
            {
                alertDelay.Dispose();
                alertDelay = null;
            }
        }

        UIViewController topViewControllerWithRootViewController(UIViewController rootViewController)
        {
            try
            {
                if (rootViewController is UITabBarController)
                {
                    UITabBarController tabBarController = (UITabBarController)rootViewController;
                    return topViewControllerWithRootViewController(tabBarController.SelectedViewController);
                }
                else if (rootViewController is UINavigationController)
                {
                    UINavigationController navigationController = (UINavigationController)rootViewController;
                    return topViewControllerWithRootViewController(navigationController.VisibleViewController);
                }
                else if (rootViewController.PresentedViewController != null)
                {
                    UIViewController presentedViewController = rootViewController.PresentedViewController;
                    return topViewControllerWithRootViewController(presentedViewController);
                }
            }
            catch (Exception)
            {
            }
            return rootViewController;
        }

1 Ответ

0 голосов
/ 10 июня 2019

В iOS нет собственного эквивалента тоста. Но есть много способов сделать это, как упомянуто здесь: Тост-эквивалент для форм Xamarin

Будет работать одно из множества упомянутых решений, и если вы ищете нативное решение, вы можете отобразить предупреждение, которое само по себе отключается по истечении указанного времени, как показано:

    public class MessageIOS
    {
        const double LONG_DELAY = 3.5;
        const double SHORT_DELAY = 2.0;

        NSTimer alertDelay;
        UIAlertController alert;

        public void LongAlert(string message)
        {
            ShowAlert(message, LONG_DELAY);
        }
        public void ShortAlert(string message)
        {
            ShowAlert(message, SHORT_DELAY);
        }

        void ShowAlert(string message, double seconds)
        {
            alertDelay = NSTimer.CreateScheduledTimer(seconds, (obj) =>
            {
                dismissMessage();
            });
            alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert);
            UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(alert, true, null);
        }

        void dismissMessage()
        {
            if (alert != null)
            {
                alert.DismissViewController(true, null);
            }
            if (alertDelay != null)
            {
                alertDelay.Dispose();
            }
        }
    }
...