-(void)viewDidLoad {
NSMutableArray *coolImagesArray = [[NSMutableArray alloc] initWithObjects:@"active-1.jpg", @"active-2.jpg", @"active-3.jpg", @"active-4.jpg", @"active-5.jpg", nil];
}
-(void)someMethodWithData {
dispatch_async(dispatch_get_main_queue(), ^{
NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
NSMutableString *inactiveString = [[NSMutableString alloc] init];
for (int i = 0; i < progress; i++) {
imageView.image = [UIImage imageNamed:[coolImagesArray objectAtIndex:i]];
inactiveString = [NSMutableString stringWithFormat:@"inactive-%d.png",i];
[imagesArray addObject:imageView];
}
UIImage *setImage = [UIImage imageNamed:@"inactive-1.png"];
for (int i = 0; i < [imagesArray count]; i++) {
[(UIImageView*)[imagesArray objectAtIndex:i] setImage:setImage];
}
});
}
这将始终正确设置最后一张或第i张图像。它不会循环和更改我需要的所有图像。还有另一种方法可以解决这个问题吗?
答案 0 :(得分:1)
imageView指向一个UIImageView对象,在循环中,您正在更改imageView的图像,而不是向您的数组添加新的UIImageView对象。数组中的所有对象都指向1个UIImageView对象。因此,只能更改最后一个对象的图像是很正常的,因为阵列中没有其他对象。 你应该这样做:
dispatch_async(dispatch_get_main_queue(), ^{
NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
NSMutableString *inactiveString = [[NSMutableString alloc] init];
for (int i = 0; i < progress; i++) {
UIImageView *temp = [[UIImageView alloc] initWithFrame:imageView.frame];
temp.image = [UIImage imageNamed:[coolImagesArray objectAtIndex:i]];
inactiveString = [NSMutableString stringWithFormat:@"inactive-%d.png",i];
[imagesArray addObject:temp];
}
UIImage *setImage = [UIImage imageNamed:@"inactive-1.png"];
for (int i = 0; i < [imagesArray count]; i++) {
[(UIImageView*)[imagesArray objectAtIndex:i] setImage:setImage];
}
});
答案 1 :(得分:0)
对于初学者,我会创建一次图像以节省内存。
我还会将对象转换为UIImageView(不确定它是如何在xcode中标记的)。
最后我将它包装在dispatch_async()中,以确保它在主UI线程上发生,因为它可能在后台线程上被调用,并且不知何故最后一个图像使它进入主运行循环,无论是这种方式是它的样子:
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *setimage = [UIImage imageNamed:@"set-image.png"];
for (int i = 0; i < [imagesArray count]; i++) {
[(UIImageView *)[imagesArray objectAtIndex:i] setImage:setimage]];
}
});