Отчаянно нужен модальный MessageBox Xamarin.IOS, как всплывающее окно - PullRequest
0 голосов
/ 12 января 2019

Кодирование в Xamarin IOS. У меня есть всплывающее окно с типом всплывающего списка, где, если Конечный пользователь вводит новое значение, я хочу задать вопрос да / нет: Вы хотите добавить новую строку?

Элемент управления находится внутри UIStackView, который находится внутри контейнера UIView, который, в свою очередь, находится внутри другого, который представлен посредством segue. Xamarin потребовал UIPopoverController, который я реализовал. Вот код, который я имею до сих пор:

using System.Threading.Tasks;
using Foundation;
using UIKit;

namespace PTPED_Engine
{

    public enum MessagePopupType
    {
        YesNo = 1,
        OKCancel = 2,
        OKOnly = 3
    }

    public enum PopupResultType
    {
        OK = 1,
        Cancel = 2,
        Yes = 3,
        No = 4
    }

    public static class AlertPopups
    {
        static NSObject nsObject;

        public static void Initialize(NSObject nsObject)
        {
            AlertPopups.nsObject = nsObject;
        }
        public static Task<PopupResultType> AskUser(UIViewController parent, UIView V, string strTitle, string strMsg, MessagePopupType mpt)
        {
            using (UIPopoverController pc = new UIPopoverController(parent))
            {
               // pc.ContentViewController
                // method to show an OK/Cancel dialog box and return true for OK, or false for cancel
                var taskCompletionSource = new TaskCompletionSource<PopupResultType>();

                var alert = UIAlertController.Create(strTitle, strMsg, UIAlertControllerStyle.ActionSheet);
                // set up button event handlers
                if (mpt == MessagePopupType.OKCancel)
                {
                    alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.OK)));
                    alert.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.Cancel)));
                }
                if (mpt == MessagePopupType.YesNo)
                {
                    alert.AddAction(UIAlertAction.Create("Yes", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.Yes)));
                    alert.AddAction(UIAlertAction.Create("No", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.No)));
                }
                if (mpt == MessagePopupType.OKOnly)
                {
                    alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult(PopupResultType.OK)));
                }
                // show it
                nsObject.InvokeOnMainThread(() =>
                {
                    pc.PresentFromRect(V.Bounds, V, UIPopoverArrowDirection.Any, true);
                });

                return taskCompletionSource.Task;
            }
        }
    }
}

и я вызываю его следующим образом:

LookupCombo.Completed += async (object sender, CompletedEventArgs e) =>
{
    C1AutoComplete AC = (C1AutoComplete)sender;
    if (AC.Text.Trim() != "")
    {
        string sColName = AC.AccessibilityIdentifier.Trim();
        var ValuesVC = (List<Lookupcombo_Entry>)AC.ItemsSource;
        var IsThisAHit = from Lookupcombo_Entry in ValuesVC
                         where Lookupcombo_Entry.sDispVal.ToUpper().Trim() == e.value.ToUpper().Trim()
                         select Lookupcombo_Entry.sMapVal;
        if (!IsThisAHit.Any())
        {
            string sTitle = "";
            string sFull = _RM.GetString(sColName);
            if (sFull == null) { sFull = "???-" + sColName.Trim(); }
            sTitle = " Add New " + sFull.Trim() + "?";
            string sPPrompt = "Do you want to add a new " + sFull.Trim() + " named " + AC.Text.Trim() + " to the Database?";
            var popupResult = await AlertPopups.AskUser(CurrentViewController(), V, sTitle, sPPrompt, MessagePopupType.YesNo);
          }
    }
};

CurrentViewController определяется следующим образом:

    private UIViewController CurrentViewController()
    {
        var window = UIApplication.SharedApplication.KeyWindow;
        var vc = window.RootViewController;
        while (vc.PresentedViewController != null)
        {
            vc = vc.PresentedViewController;
        }
        return vc;
    }

Это ничего не делает. Висит пользовательский интерфейс.

Это должно быть встроено, но оно встроено только в Xamarin.Forms, которые я не хочу использовать.

У меня нет проблем с этим делом в ожидании, но это просто не работает. Кто-нибудь может помочь?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вы можете просто использовать библиотеку ACR UserDialogs: https://github.com/aritchie/userdialogs

0 голосов
/ 14 января 2019

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

Вот мое решение от нескольких лет назад:

iphone UIAlertView Modal

...