如何使用UIAlertController从UIViewController显示警报消息

时间:2015-02-24 12:23:34

标签: c# ios8 xamarin.ios xamarin

我正在尝试使用UIAlertController中的UIViewController来显示消息。 使用VisualStudio 2015 CTP 5 ...

使用过的样本:

http://forums.xamarin.com/discussion/26404/uialertcontroller-question-for-ipad http://www.hjerpbakk.com/blog/2014/11/23/from-uialertview-to-uialertcontroller-using-xamarin-and-async-await https://gist.github.com/Sankra/622e5855f95189e13d77

根据上面的样本,到目前为止我有这个:

public partial class MyViewController : GenericViewController //inherits from UIViewController 
{
   .....
     public async override void ViewDidLoad()
     {
            try
            {

                base.ViewDidLoad();
                //other irrelevant code here
                throw new Exception("Something went wrong");
            }
            catch (Exception ex)
            {
                    int result =   await AlertViewControllerHelper.ShowAlertDialogAsync(this, ex.StackTrace, true); 
            }
     }  
      ........
}

我的静态助手类:

public static class AlertViewControllerHelper 
{
public static Task<int> ShowAlertDialogAsync(UIViewController parent, string stackTrace, bool debugMode = false)
{

    var taskCompletionSource = new TaskCompletionSource<int>();

    try
    {
        var alert = UIAlertController.Create("Error", stackTrace, UIAlertControllerStyle.ActionSheet);
        if (alert.PopoverPresentationController != null)
        {
            alert.PopoverPresentationController.SourceView = parent.View;
            alert.PopoverPresentationController.SourceRect = parent.View.Bounds;
        }

        alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default,
            a => taskCompletionSource.SetResult(0)));
        if (debugMode)
        {
            alert.AddAction(UIAlertAction.Create("Info", UIAlertActionStyle.Default,
                a => taskCompletionSource.SetResult(1)));
        }

        parent.PresentViewController(alert, true, null);

    }
    catch (Exception ex)
    {               
    }
    return taskCompletionSource.Task;
}

运行代码后,我的错误对话框未显示。 我已经使用UIAlertView完成了一个示例,但到目前为止UIAlertController没有运气(这是我的要求)

提前致谢...

2 个答案:

答案 0 :(得分:3)

找到解决方案:
1.传递ParentViewController而不是当前视图控制器(this)

public partial class MyViewController : GenericViewController //inherits from UIViewController 
{

  .....
 public async override void ViewDidLoad()
 {
        try
        {

            base.ViewDidLoad();
            //other irrelevant code here
            throw new Exception("Something went wrong");
        }
        catch (Exception ex)
        {
            int actionCode = await AlertViewControllerHelper.ShowAlertDialogAsync(ParentViewController, AlertViewControllerHelper.ERRORDESCRIPTION);

            if (actionCode == AlertViewControllerHelper.INFOACTIONCODE)
            {
                await AlertViewControllerHelper.ShowAlertDialogAsync(ParentViewController, string.Format("{0} : {1}", ex.Message, ex.StackTrace), actionCode);
            }
        }   
 }  
  ........
}
  1. 然后Helper方法将实现如下:

    public static Task<int> ShowAlertDialogAsync(UIViewController parent, string stackTrace, int actionCode = 0)
        {
            bool isDebug = false;
    
    // #if DEBUG
            isDebug = true;
    //#endif
    
           var taskCompletionSource = new TaskCompletionSource<int>();
    
            var alert = UIAlertController.Create(ERROR, stackTrace, UIAlertControllerStyle.Alert);
            if (alert.PopoverPresentationController != null)
            {
                alert.PopoverPresentationController.SourceView = parent.View;
                alert.PopoverPresentationController.SourceRect = parent.View.Bounds;
            }
    
            alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default,
                a => taskCompletionSource.SetResult(0)));
            if (isDebug && actionCode == OKACTIONCODE)
            {
                alert.AddAction(UIAlertAction.Create("Info", UIAlertActionStyle.Default,
                    a => taskCompletionSource.SetResult(1)));
            }
    
            parent.PresentViewController(alert, true, null);
    
            return taskCompletionSource.Task;
        }
    

答案 1 :(得分:0)

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

namespace Sample
{

public partial class ViewController : UIViewController
{

    public ViewController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        // Perform any additional setup after loading the view, typically from a nib.

    }

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);
        this.InvokingMethod ();

    }

    public static Task<bool> ShowOKCancel (UIViewController parent, string strTitle, string strMsg)
    {
        // method to show an OK/Cancel dialog box and return true for OK, or false for cancel
        var taskCompletionSource = new TaskCompletionSource<bool> ();

        var alert = UIAlertController.Create (strTitle, strMsg, UIAlertControllerStyle.ActionSheet);
        // set up button event handlers
        alert.AddAction (UIAlertAction.Create ("OK", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult (true)));
        alert.AddAction (UIAlertAction.Create ("Cancel", UIAlertActionStyle.Default, a => taskCompletionSource.SetResult (false)));
        // show it
        parent.PresentViewController (alert, true, null);

        return taskCompletionSource.Task;
    }

    private async void InvokingMethod ()
    {
        var userClickedOk = await ShowOKCancel (this, "Action Sheet Title", " It is just awesome!");
        // go on to use the result in some way      

        if (userClickedOk) {
            Console.WriteLine ("Clicked on Okay");

        } else {                
            Console.WriteLine ("Clicked on Cancel");
        };
    }

    public override void DidReceiveMemoryWarning ()
    {
        base.DidReceiveMemoryWarning ();
        // Release any cached data, images, etc that aren't in use.
    }
}
}