2012-11-26 18 views
1

我有一個ViewController中的UITableView執行segue到另一個ViewController的詳細視圖。部分詳細信息視圖是從異步Web服務填充的,這可能需要一些時間。
我希望我的UIAlertView在tableView接收到RowSelected事件時顯示,並在web服務調用完成後隱藏。顯示UIAlertView之前segue到下一個視圖

因爲它是現在的順序:
1.填充的UITableView(正常工作)
2.接收RowSelected事件(正常工作)
3.顯示UIAlertView中味精 「加載」(表示爲時已晚)
4.執行細節視圖(正常工作)
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

你可以發佈你的'ActivityThread'代碼嗎? – jonathanpeppers

回答

1

你的代碼有點難以遵循(只是試圖幫助)。我幾乎建議完全擺脫ActivityThread課程,它的用處對我來說並不那麼明顯 - 可能會更容易直接在需要的地方使用您的課程loadingView。儘管如此,除了這一點,這一切都是如此

您是否嘗試過不使用BeginInvokeOnMainThread來顯示某些情況下的加載視圖?

您可以檢查它是否已經在主線程上做類似:

if (NSThread.CurrentThread.IsMainThread)

這是把我的頭頂部,但應該接近。您還可能需要一個布爾標誌來指示是否應該調用BeginInvoke

相關問題