Monotouch对话框 - 在运行时添加和删除元素

时间:2012-09-06 09:59:31

标签: multithreading monotouch.dialog

我在MonoTouch.Dialog中有一个应用程序,我尝试使用ActivityElement。

我的计划是先显示一个activity元素,然后进行webservice调用,当我得到响应时,我会删除activity元素,而是添加一些新的字符串元素。 这不起作用。显示视图后,我无法删除或添加元素。

我该如何解决这个问题?

rootElement = new RootElement ("Mobile Servicedesk"){
                (requestSection = new Section ("My requests"){
                    new ActivityElement()
                })
            };
            new Thread (() => {
                var incidents = IncidentProvider.LoadMyRequests ();
                requestSection.Elements.Clear ();
                foreach (var item in incidents) {
                    requestSection.Elements.Add (new StringElement(item.Name))
                }
            }
            ).Start ();

修改

好的,现在我已经解决了更新部分,至少在我的解决方案的一部分中。

InvokeOnMainThread (() => {
                    ReloadData();
                });

ReloadData()在我的appDelegate视图中工作,但不在我的子视图中。我甚至试图确保它在主线程上被调用但仍然没有运气......

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

这是我在我的应用中使用的代码'完全按照你想要做的。

LoadingView loading;

ThreadPool.QueueUserWorkItem ((f) => {
    // runs UI stuff on main thread
    InvokeOnMainThread (delegate {
        loading = new LoadingView();    
        loading.Show("Do something...");
    });

    // Methods that do whatever you wan, that runs on a different thread
    DoSomething();

    // runs UI stuff on main thread
    InvokeOnMainThread (delegate { 
        loading.Hide();
        new UIAlertView("Title", "Message", null, "Button", null).Show();
    }); 
});

您的主要问题是,当您执行new Thread(...)时,您想要编辑您的UI,如果这不在主线程中,这是不可能的。

在我的示例中,DoSomething()方法,您可以调用您的网络服务,存储您的数据,然后在InvokeMainThread中按照您显示的方式创建您的Root。

答案 1 :(得分:0)

啊!明白了!

由于我有第二个RootElement,我需要在该特定的根上调用ReloadData ...现在它可以工作了!