我对编程很新,所以我希望这是一个非常简单的错误。我使用visual studio在xamarin ios应用程序中创建了UILabel
,我希望每隔30秒用新数据更新它。我已经让它更新了,但是我的标签中只有新的数字,而不是我的前一个数字,在经过几次运行之后,它是不可读的。如何制作,以便我只在int
中获得UILabe
的新值?
我的代码如下
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 :(得分: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了解详情。
答案 1 :(得分:1)
您正在循环的每次迭代中创建一个新Label,然后将其分层到现有标签之上。相反,您应该只创建一次标签,并且只更新它的值:
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);
}
}