我正在尝试使用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
没有运气(这是我的要求)
提前致谢...
答案 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);
}
}
}
........
}
然后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.
}
}
}