I'm trying to display message using UIAlertController in my UIViewController.
Using VisualStudio 2015 CTP 5...
Used samples from:
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
Based on samples above I have this so far:
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);
}
}
........
}
My static helper class:
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;
}
After running the code my error dialogue is not is being displayed.
I've completed an example using UIAlertView but so far no luck with UIAlertController (and that's my requirement)
Thanks in advance...
Found solution for this:
1. Pass ParentViewController instead of the current view controller (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);
}
}
}
........
}
Then the Helper method will be implemented like this:
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With