1

別の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 を実行スタックの一番上に移動するにはどうすればよいですか?

4

1 に答える 1

1

あなたのコードは従うのが少し難しいです(ただ助けようとしているだけです)。そのクラスを完全に取り除くことをお勧めします。その有用性は私にはそれほど明白ではありません。必要な場所でクラスを直接ActivityThread使用する方が簡単かもしれません。loadingViewしかし、それだけではありません。

BeginInvokeOnMainThread場合によっては、読み込みビューを表示するために使用しないようにしましたか?

次のような操作を行うことで、すでにメインスレッドにあるかどうかを確認できます。

if (NSThread.CurrentThread.IsMainThread)

それは私の頭のてっぺんから外れていますが、近くにあるはずです。また、呼び出す必要があるかどうかを示すブールフラグが必要になる場合もありますBeginInvoke

于 2012-11-30T13:00:41.970 に答える