#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"];
.
Всякий раз, когда вы используете любой из двух описанных выше способов, вы заменяете текст в этой метке текстом «Что-то». Если вы хотите что-то добавить к этой метке, вы должны включить старый текст в свою новую строку.