【问题标题】:MonoTouch DialogViewController is Empty Until TouchedMonoTouch DialogViewController 在被触摸之前是空的
【发布时间】:2012-04-10 17:23:46
【问题描述】:

我有一个带有DialogViewControllerTabBarController 应用程序,它工作正常,除了在初始加载时表格是空的,直到我触摸它或导航到另一个选项卡并返回 (http://cl.ly/3I0r1v2b420t0L1X1h2w)。

我已经确认Root 已设置。我试过之后发出ReloadData()。我也试过直接设置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);
    }
}

【问题讨论】:

  • 在初始加载和第二次加载时调用(或不调用)哪些事件?
  • 如果我明白你在问什么...我在所有方法中都设置了断点,并且这些方法只在应用程序初始化时调用一次。然后我触摸 UITableView 并在滚动时显示数据。如果我点击另一个选项卡并返回,结果相同...在该 DialogViewController 中没有调用其他任何内容,但数据显示出来。

标签: xamarin.ios monotouch.dialog


【解决方案1】:

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);
        });
    }

【讨论】:

    【解决方案2】:

    尝试只填充现有的 Root 而不是创建新的 Root。

    如果您查看 DialogViewController 的 MonoTouch.Dialog 源代码,您应该会找到 PrepareRoot() 方法。看看它在哪里被调用,它应该开始有意义了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多