【问题标题】:Weird blocks when adding Elements to MonoTouch Dialog RootElement after it is shown显示后将元素添加到 MonoTouch Dialog RootElement 时出现奇怪的块
【发布时间】:2012-03-16 10:22:03
【问题描述】:

在我正在构建的应用程序中,我使用以下模式:如果用户单击分层导航元素,我会立即打开下一个 UIViewController,它会自行加载数据并显示加载微调器(如果是)通过网络。

现在大多数列表视图都是使用MonoTouch 创建的。在一个 DialogViewController 上,我在屏幕显示后向视图 RootElement 添加许多元素时遇到问题。

一开始StringElements 在屏幕上看起来很好,但如果你快速上下滚动,每一行的文本就会变成一个块:

重现问题的代码:

        var root = new RootElement("Root");
        var dvc = new DialogViewController(root) { AutoHideSearch = true, EnableSearch = true };

        nav.PushViewController(dvc, true);

        Task.Factory.StartNew(() => {
                Thread.Sleep(TimeSpan.FromSeconds(1));
            UIApplication.SharedApplication.InvokeOnMainThread(() => {
                var sec = new Section();

                for (int i = 0; i < 100; i++)
                {
                    var el = new StyledStringElement("Test", "Test", UITableViewCellStyle.Value1);
                    sec.Add(el);
                }

                root.Add(sec);
            });
        });

有趣的是,只有左边的字符串看起来像一个块,而右边的字符串很好。另外,在他们的 MWC(演示)应用程序中,Xamarin created a new RootElement to repopulate the twitter list as well

【问题讨论】:

    标签: ios xamarin.ios monotouch.dialog


    【解决方案1】:

    似乎没有重新加载在主线程上调用的数据源以正确呈现新值:

    var dvc = new DialogViewController(new RootElement(""));
    _root = new UINavigationController();
    _root.PushViewController(dvc, true);
    _window.RootViewController = _root;
    
    Task.Factory.StartNew(() => {
        Thread.Sleep(TimeSpan.FromSeconds(1));
        var section = new Section("");
            foreach (var i in Enumerable.Range(1, 100)) {
                section.Add(new StyledStringElement(i.ToString(), "cell", UITableViewCellStyle.Value1));
            }
    
        dvc.Root.Add(section);
        BeginInvokeOnMainThread(() => {
            dvc.ReloadData();
        });
    });
    

    【讨论】:

    • 但是为什么一开始它会起作用,然后向下和向上滚动后会中断?
    • 抱歉,我最初的假设似乎是错误的。我正在调整答案。
    • 添加 dvc.ReloadData(); 确实可以解决问题。但根据我有限的理解,这是我应该提交的错误。请对该问题进行投票,因为您认为值得回答;-) 我将等待“接受”,直到收到错误报告的回复。
    • 有问题..我决定自己创建一个元素来解决这个问题。
    【解决方案2】:

    当我在 BeginInvokeOnMainThread 语句中动态渲染元素时,我遇到了同样的问题 如果我在构造函数中加载元素,UI 会被阻塞,但元素会很好地呈现。

    感谢提示 dvc.ReloadData 对我也有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多