我在 ViewController 中有一个 UITableView,它对另一个 ViewController 中的详细视图执行 segue。部分详细视图是从异步 Web 服务填充的,这可能需要一些时间。
我希望我的 UIAlertView 在 tableView 收到 RowSelected 事件时显示并在 web 服务调用完成后隐藏。
现在的序列:
1. 填充 UITableView(工作正常)
2. 接收 RowSelected 事件(工作正常)
3. 显示带有 msg“正在加载”的 UIAlertView(显示为时已晚)
4. 执行 segue 到详细视图(工作正常)
5 . 将全局变量中的值加载到文本字段中。(工作正常) 6. 执行异步 Web 服务以获取附加详细信息(工作正常)
7. 隐藏 UIAlertView(工作正常)
问题是 UIAlertView 只显示在第 4 步和第 5 步之间。
RowSelected 事件的来源:
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
ActivityThread.Start ("Loading Quote list"); //shows UIAlertView
var quoteList = service.GetQuoteList(Globals.UserName,Globals.Password,Globals.CompanyId,Globals.SelectedCustomer.CustomerId);
Globals.QuoteSelected = quoteList[indexPath.Row];
ViewQuote viewQuote = new ViewQuote(QuoteViewController.handle);
viewQuote.PerformSegue("quoteSegue",this);
tableView.DeselectRow (indexPath, true);
}
详细视图的来源负载:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
handle = Handle;
//ActivityThread.Start("Retrieving Quote Data"); //shows UIAlertView too late
LoadGlobalVariables();
//hook up async websvc call
service.GetQuoteLineListCompleted += new GetQuoteLineListCompletedEventHandler(OnGetQuoteLineListCompleted);
service.GetQuoteLineListAsync(Globals.UserName,Globals.Password,Globals.CompanyId,Globals.SelectedCustomer.CustomerId,Globals.QuoteSelected.DocumentHeaderId);
}
asyncCompleted 事件的来源:
void OnGetQuoteLineListCompleted (object sender, GetQuoteLineListCompletedEventArgs args)
{
var QuoteLineList = args.Result;
QuoteItemTableView.Source = new QuoteItemTableSource(LoadLineData (QuoteLineList.ToList ()));
ActivityThread.Stop (); //hide UIAlertview
}
活动线程的来源:
public static class ActivityThread
{
private static Thread AcThread { get; set; }
private static UILoadingView _loadView
{ get; set;}
public static void Start(string title)
{
AcThread = new Thread(NewThreadMethod as ThreadStart);
_loadView = new UILoadingView("", title);
AcThread.Start();
_loadView.BeginInvokeOnMainThread (delegate{_loadView.Show();});
}
public static void Stop()
{
AcThread.Abort();
_loadView.BeginInvokeOnMainThread (delegate{_loadView.Hide ();});
}
[Export("NewThreadMethod")]
static void NewThreadMethod()
{
using(var pool = new NSAutoreleasePool()) {}
}
}
如何让 UIAlertView 转到执行堆栈的顶部?