Xamarin.ios 在转到下一个视图之前显示UIAlertView

Xamarin.ios 在转到下一个视图之前显示UIAlertView,xamarin.ios,ios6,Xamarin.ios,Ios6,我在ViewController中有一个UITableView,它执行到另一个ViewController中的详细视图的转换。部分详细信息视图由异步Web服务填充,这可能需要一些时间。 我希望我的UIAlertView在tableView接收到RowSelected事件时显示,并在webservice调用完成后隐藏 现在的顺序: 1.填充UITableView(工作正常) 2.接收选定事件(工作正常) 3.显示带有消息“加载”的UIAlertView(显示太迟) 4.执行从细节视图到细节视图的转

我在ViewController中有一个UITableView,它执行到另一个ViewController中的详细视图的转换。部分详细信息视图由异步Web服务填充,这可能需要一些时间。
我希望我的UIAlertView在tableView接收到RowSelected事件时显示,并在webservice调用完成后隐藏

现在的顺序:
1.填充UITableView(工作正常)
2.接收选定事件(工作正常)
3.显示带有消息“加载”的UIAlertView(显示太迟)
4.执行从细节视图到细节视图的转换(工作正常)
5.将全局变量中的值加载到文本字段中。(工程罚款) 6.执行异步Web服务以获取添加详细信息(工作正常)
7.隐藏UIAlertView(工作正常)

问题是UIAlertView只在步骤4和步骤5之间显示

所选事件的源:

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进入执行堆栈的顶部

你的代码有点难理解(只是想帮你)。我几乎建议完全去掉
ActivityThread
类,它的用处对我来说并不明显——直接在需要的地方使用
loadingView
类可能更容易。不过,除此之外,这就是问题所在

在某些情况下,您是否尝试过不使用
BeginInvokeMainThread
来显示加载视图

您可以通过执行以下操作来检查它是否已在主线程上:

if(NSThread.CurrentThread.IsMainThread)


这是我的想法,但应该很接近。您还可能需要一个布尔标志,指示它是否应该调用
BeginInvoke

您的代码有点难以理解(只是试图帮助)。我几乎建议完全去掉
ActivityThread
类,它的用处对我来说并不明显——直接在需要的地方使用
loadingView
类可能更容易。不过,除此之外,这就是问题所在

在某些情况下,您是否尝试过不使用
BeginInvokeMainThread
来显示加载视图

您可以通过执行以下操作来检查它是否已在主线程上:

if(NSThread.CurrentThread.IsMainThread)


这是我的想法,但应该很接近。您还可能需要一个布尔标志,指示它是否应该调用
BeginInvoke

您可以发布
ActivityThread
的代码吗?您可以发布
ActivityThread
的代码吗?