2012-04-10 21 views
1

TabBarControllerのアプリはDialogViewControllerで、最初の読み込み時にテーブルが空であるか、または別のタブに移動して戻るまで(http://cl.ly/3I0r1v2b420t0L1X1h2w)はうまく動作します。MonoTouch DialogViewControllerが空白になるまで

Rootが設定されていることを確認しました。私は後に​​を発行しようとしました。私もTableView.Sourceを直接設定しようとしました。いずれの場合も、TableViewは別のアクションが発生するまで何も表示しません。

これは、シミュレータとiPhoneで発生します。

これはどういう考えですか?

public partial class PapersView : DialogViewController 
{ 
    public PapersView() : base (UITableViewStyle.Plain, null, true) 
    { 
     EnableSearch = true; 
     AutoHideSearch = true; 
     SearchPlaceholder = @"Find Papers"; 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     MonoTouch.UIKit.UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true; 
     var svc = new PaperService(); 
     svc.GetPapers (onPapersReceived, onErrorReceived); 
    } 

    private void onErrorReceived (string error) 
    { 
     MonoTouch.UIKit.UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false; 
    } 

    private void onPapersReceived (List<PaperNode> papers) 
    { 
     MonoTouch.UIKit.UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false; 

     Root = new RootElement ("Papers") { 
       from node in papers 
        group node by (node.paper.title [0].ToString().ToUpper()) into alpha 
        orderby alpha.Key 
       select new Section (alpha.Key){ 
        from eachNode in alpha 
        select (Element)new WhitePaperBible.iOS.UI.CustomElements.PaperElement (eachNode) 
     }}; 

     TableView.ScrollToRow (NSIndexPath.FromRowSection (0, 0), UITableViewScrollPosition.Top, false); 
    } 
} 
+0

最初のロードと2番目のロードでは、どのイベントが呼び出されているかどうかが確認されていますか? – Jason

+0

あなたが尋ねていることを理解していれば、私はすべてのメソッドでブレークポイントを設定します。これらは、アプリケーションの初期化時に一度しか呼び出されません。私はUITableViewに触れて、スクロールしながらデータが表示されます。別のタブに当たって戻ってきた場合と同じ結果です...そのDialogViewControllerでは何も呼び出されませんが、データが表示されます。 –

答えて

3

Curtis Baileyは、MonoTouchメーリングリストでInvokeOnMainThreadを見るように指摘しました。これは、非同期サービスコールがバックグラウンドスレッド上にあり、コールバックもそうであったため、この問題を解決しました。

private void onPapersReceived (List<PaperNode> papers) 
    { 
     MonoTouch.UIKit.UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false; 

     InvokeOnMainThread (delegate { 
      Root = new RootElement("Papers") { 
        from node in papers 
         group node by (node.paper.title [0].ToString().ToUpper()) into alpha 
         orderby alpha.Key 
        select new Section (alpha.Key){ 
         from eachNode in alpha 
         select (Element)new WhitePaperBible.iOS.UI.CustomElements.PaperElement (eachNode) 
      }}; 

      TableView.ScrollToRow (NSIndexPath.FromRowSection (0, 0), UITableViewScrollPosition.Top, false); 
     }); 
    } 
1

新しいルートを作成するのではなく、既存のルートを作成してみてください。

DialogViewControllerのMonoTouch.Dialogソースを見る場合は、PrepareRoot()メソッドが必要です。それがどこに呼ばれているのかを見て、それが理にかなっているはずです。

関連する問題