обновление UILabel программным путем

#iphone #loops #uilabel

#iPhone #циклы #uilabel

Вопрос:

Я пытаюсь обновлять текст UILabel в цикле на каждой итерации, но он отображает только последнее значение, независимо от того, есть ли время, затраченное на завершение цикла, около 30-50 секунд.

Вот код:

 for (float i=0; i< [topicNew count]; i  ) {

    NSDictionary *new= [topicNew objectAtIndex:i];
    NSString *imageName = [[[NSString alloc] initWithFormat:@"%@.%@.%@.png", appDelegate.subject,topicNamed,[new objectForKey:kWordTitleKey]] autorelease];
    NSString *imagePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:imageName];
    NSData *imageData = [self ParsingImagePath:[new objectForKey:kWordImagePathKey]];
    [progressView setProgress:i/[topicNew count]];
    [self setProgress:i/[topicNew count]]; 
    [self.lbltest setText:@"Image Downloading..."];
    self.lbltest.text =imageName;
    //NSLog(@"sending %f",i/[topicNew count]);
    //lblpercent.text = [NSString stringWithFormat:@"%d",i];
    [lblpercent setText:[[NSString stringWithFormat:@"%.0f",i/[topicNew count]] stringByAppendingString:@"%"]];
    //[self.view addSubview:viewalert];
    [self updateLabel:self];
    NSLog(@"%@,%d",imageName,i);
    if(imageData != nil)
        [imageData writeToFile:imagePath atomically:YES];
    else
        [[NSFileManager defaultManager] removeItemAtPath:imagePath error:NULL];

    NSMutableDictionary *newWord = [NSMutableDictionary dictionaryWithObjectsAndKeys:[new objectForKey:kWordTitleKey], kWordTitleKey, [new objectForKey:kWordDefinitionKey], kWordDefinitionKey, imagePath, kWordImagePathKey, appDelegate.subject,kSubjectKey,topicName,kTopicKey,[new objectForKey:kWordMemorizedKey], kWordMemorizedKey, nil];
    [newTopic addObject:newWord];

}
  

Комментарии:

1. Ответить на вопрос совершенно невозможно… без вопросов.

2. Кстати, где вы определили атрибут UILabel? Вы создаете его программно или через Interface Builder?

3. Здесь нужно договориться о marzapower. Мне кажется, у вас две проблемы: вы можете получить только последнее значение на вашей метке вместо всех … и ваш цикл занимает слишком много времени для завершения. Пожалуйста, сформулируйте свои вопросы правильно, чтобы полезным людям не пришлось задавать вопросы по вашему вопросу.

Ответ №1:

Я думаю, проблема в том, что ваш поток заблокирован вашим циклом. Итак, вам нужно выполнить свой метод в фоновом режиме и использовать

 [self performSelectorInBackground:@selector(myMethod) withObject:nil];
  

Не забудьте указать «myMethod»;

 -(void)myMethod{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//I do my label update
[pool release];
}
  

Ответ №2:

То, как вы используете его сейчас, действительно заменяет текст. Я не знаю, какой ярлык вы хотели бы обновить. Если вы хотите обновить, например, lbltest то, что загружается постоянно, вам следует изменить self.lbltest.text = imageName; на [self.lbltest setText:@"%@ %@", self.lbltest.text, imageName];

Таким образом, ваш старый текст не заменяется вашим новым текстом, но ваш новый текст добавляется к вашему старому тексту.

Использование labelName.text = @"Something"; изменяет текст на этой метке на Something .

То же самое касается [labelName setText:@"Something"]; .

Всякий раз, когда вы используете любой из двух описанных выше способов, вы заменяете текст в этой метке текстом «Что-то». Если вы хотите что-то добавить к этой метке, вы должны включить старый текст в свою новую строку.