2015-10-21 2 views
1

Я новичок в программировании, поэтому я надеюсь, что это очень простая ошибка. Я создал UILabel в приложении xamarin ios, используя визуальную студию, и я хочу обновлять ее новыми данными каждые 30 секунд. Я получил его для обновления, но вместо нового номера на моем ярлыке, я получаю новый номер поверх моего предыдущего номера, который, хотя несколько раз работает, не читается. Как это сделать, чтобы получить только новое значение моего int в UILabe?xamarin ios uilabel issues

Мой код выглядит следующим образом

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

просто явным образом объявляю его как Label вместо использования 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 в другом потоке. Это может вызвать проблемы. Вы должны постоянно обновлять код пользовательского интерфейса в основном потоке. Так что лучше, чтобы изменить линию

t1label.Text = mytest.ToString(); 

в

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

Читать this для получения дополнительной информации.