別のViewControllerの詳細ビューへのセグエを実行するViewControllerにUITableViewがあります。詳細ビューの一部は、非同期 Web サービスから読み込まれるため、時間がかかる場合があります。
tableView が RowSelected イベントを受け取ったときに UIAlertView を表示し、Web サービスの呼び出しが完了すると非表示にします。
現在のシーケンス:
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 を実行スタックの一番上に移動するにはどうすればよいですか?