2015-10-21 77 views
1

我对编程颇为陌生,所以我希望这是一个非常简单的错误。我在使用visual studio的xamarin ios应用程序中创建了一个UILabel,我想每30秒用新数据更新一次。我已经得到了它的更新,但不仅仅是我的标签中的新号码,我在我以前的号码上获得了新的号码,但经过几次运行后,它是不可读的。我该如何制作,因此我只能在UILabe中获得int的新价值?xamarin ios uilabel问题

我的代码如下

int mytest = 0; 
    private async Task RefreshAsync() 
    { 
     while (0 == 0) 
     { 
      mytest++; 

      var t1label = new UILabel(new RectangleF(10, 10, 200, 100)); 
      t1label.Text = mytest.ToString(); 
      View.Add(t1label); 
      t1label.Font = UIFont.SystemFontOfSize(25); 
      await Task.Delay(30000); 

     } 
    } 
+0

我正面临同样的问题。 while循环之前,您必须初始化标签。 –

回答

1

您在每次循环创建一个新的标签,然后分层它在现有标签的上面。相反,你应该只创建标签一次,只更新它的值:

int mytest = 0; 

// create the label outside of the loop 
var t1label = new UILabel(new RectangleF(10, 10, 200, 100)); 
t1label.Text = mytest.ToString(); 
View.Add(t1label); 
t1label.Font = UIFont.SystemFontOfSize(25); 

private async Task RefreshAsync() 
{ 
    while (0 == 0) 
    { 
     mytest++; 

     t1label.Text = mytest.ToString(); 

     await Task.Delay(30000); 
    } 
} 
+0

我试图按照上面的建议去做,但是当我这样做时,我会遇到很多错误。主要是在var创建标签时。它有错误“上下文关键字'var'可能只出现在局部变量声明或脚本代码中”我在这里丢失了一些简单的东西吗?是否有可能创建一个公共标签? – JSheller

+0

只是明确声明它是标签而不是使用var – Jason

+0

我希望这是我最后的问题:我如何将它添加到视图? view.add(t1label)在这种情况下不起作用,因为它不在类中。我非常感谢你的帮助!我得到的错误是“名称'View.add'在当前上下文中不存在。” – JSheller

2

您创建整个UILabel每次循环运行。这就是它出现在屏幕上多次的原因。

在循环外部创建标签并仅刷新循环内的Text属性。例如像这样:

int mytest = 0; 
private async Task RefreshAsync() 
{ 
    var t1label = new UILabel(new RectangleF(10, 10, 200, 100));   
    View.Add(t1label); 
    t1label.Font = UIFont.SystemFontOfSize(25); 

    while (true) 
    { 
     t1label.Text = mytest.ToString(); 
     mytest++; 
     await Task.Delay(30000); 
    } 
} 

更多信息: 你被标签的Text在不同的线程更新改变UI。这可能会导致问题。您应该始终在主线程上执行UI更新代码。所以,最好是行

t1label.Text = mytest.ToString(); 

改变

InvokeOnMainThread(() => t1label.Text = mytest.ToString()); 

阅读this以获取更多信息。