1

我在 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 转到执行堆栈的顶部?

4

1 回答 1

1

您的代码有点难以理解(只是想提供帮助)。我几乎建议完全摆脱那个类,它的用处对我来说并不是那么明显——在你需要的地方直接ActivityThread使用你的类可能更容易。loadingView不过,这一切都不是重点。

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

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

if (NSThread.CurrentThread.IsMainThread)

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

于 2012-11-30T13:00:41.970 回答