我在ViewController中有一个UITableView,它在另一个ViewController中对一个细节视图执行segue。部分详细信息视图是从异步Web服务填充的,这可能需要一些时间 我希望我的UIAlertView能够在tableView收到RowSelected事件时显示,并在webservice调用完成后隐藏。
现在的顺序:
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
}
ActivityThread的来源:
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进入执行堆栈的顶部?
答案 0 :(得分:1)
你的代码有点难以理解(只是想提供帮助)。我几乎建议完全摆脱那个ActivityThread
课程,它的用处对我来说并不明显 - 可能更容易直接在你需要的地方使用你的loadingView
课程。除此之外,这就是全部。
在某些情况下,您是否尝试过不使用BeginInvokeOnMainThread
来显示加载视图?
你可以通过以下方式检查它是否已经在主线程上:
if (NSThread.CurrentThread.IsMainThread)
这是我的头脑,但应该接近。您还可以要求一个布尔标志,指示它是否应该调用BeginInvoke
。