Как выполнить действие UIAlertAction в Xamarin?

Я хочу программно нажать кнопку "Закрыть" в предупреждении об ошибке в моем приложении xamarin для iOS. Для этого мне нужно выполнить действие, связанное с этой кнопкой в ​​предупреждении. Я видел этот пост о том, как сделать это в obj-c, но я не могу понять, как это сделать в Xamarin С#. Я пытался сделать это:

        Action closeButtonAction = Marshal.GetDelegateForFunctionPointer<Action>(AlertController.Alert.Actions[0].Handle);
        closeButtonAction();

но свойство Actions Target было нулевым, поэтому при попытке выполнить его я получил NRE.

Вот как UIAlertAction выглядит в отладчике:введите здесь описание изображения


person Casey Hancock    schedule 30.05.2017    source источник


Ответы (1)


Вы можете программно отклонить UIAlertView через DismissWithClickedButtonIndex, а затем вызвать делегата через Delegate.Clicked.

Пример IUIAlertViewDelegate:

public class UIAlertViewDelegate : NSObject, IUIAlertViewDelegate
{
    [Export("alertViewCancel:")]
    public void Canceled(UIAlertView alertView)
    {
        Console.WriteLine("IUIAlertViewDelegate Cancelled");
    }

    [Export("alertView:clickedButtonAtIndex:")]
    public void Clicked(UIAlertView alertview, nint buttonIndex)
    {
        Console.WriteLine($"IUIAlertViewDelegate Clicked {buttonIndex}");
    }
}

Применение:

var autoCancelSeconds = 5;
var alert = new UIAlertView("StackOverflow", $"Auto cancel in {autoCancelSeconds} seconds", null, null, new[] { "Stack", "Over", "Flow" })
{
    Delegate = new UIAlertViewDelegate()
};
alert.Show();
await Task.Run(async () =>
{
    for (int i = autoCancelSeconds - 1; i >= 0; i--)
    {
        await Task.Delay(1000);
        InvokeOnMainThread(() =>
        {
            alert.Message = string.Format($"Auto cancel in {i} seconds");
        });
    }
    InvokeOnMainThread(() =>
    {
        alert.DismissWithClickedButtonIndex(1, true);
        alert.Delegate.Clicked(alert, 1);
    });
});

Примечание. UIAlertView устарело, вам следует перейти на использование UIAlertController

person SushiHangover    schedule 31.05.2017
comment
На самом деле я уже использую UIAlertController и представляю его с помощью UIViewController.PresentViewController(AlertController). Знаете ли вы решение при использовании UIAlertController? - person Casey Hancock; 31.05.2017