我一直在尝试编写从0到3的for循环的代码,这些代码使用其行号更改3个不同的UIImageView。
第一个将被称为“ c1”,第二个将被称为“ c2”,第三个将被称为“ c3”,等等。
这些UIImageView已经在我的.h文件中定义,并且可以在我的.m文件中访问。我以前只是通过变量简单地调用它,但是我需要遍历for循环以使过程更平滑,而不是对一堆代码进行硬编码。
当前代码:
for (int i = 0; i < 3; i++){
NSString *id = [NSString stringWithFormat:@"c%i" , i];
UIImageView *imageViewInLoop = id;
[self.imageViewInLoop setImage:[UIImage imageNamed:@"defaultphoto.jpg"]];
}
除了第三行关于使用字符串初始化UIImageView的警告外,此代码没有错误。代码将执行,但图像不会更改,并且不会打印任何内容到控制台。请注意,在回复图片和变量之前,请注意,因为我之前已成功手动完成此操作。
要按属性名称访问属性,请使用KeyValueCoding使用valueForKey:
方法通过属性名称获取imageView:
for(int i = 0; i < 3; i++){
NSString *id = [NSString stringWithFormat:@"c%i" , i];
UIImageView *imageViewInLoop = [self valueForKey:id];
[imageViewInLoop setImage:[UIImage imageNamed:@"defaultphoto.jpg"]];
}
我可以看到您正在通过构造一个表示运行时变量名称的字符串来尝试访问三个图像视图。你做不到可能最简单的方法是将三个图像视图放入NSArray
中。然后您可以通过枚举数组访问每个图像视图:
NSArray *imageViews = @[self.c1,self.c2,self.c3];
for (UIImageView *imageView in imageViews) {
[imageViews setImage:[UIImage imageNamed:@"defaultphoto.jpg"]];
}
我知道了,它将按照您的要求工作。
只需为这三个UIImageView分配一个标签,如下所示
c0.tag=1;
c1.tag=2;
c2.tag=3;
然后,您应像下面的示例一样分配新图像
for(int i = 0; i < 3; i++){
//NSString *id = [NSString stringWithFormat:@"c%i" , i];
int tagId = i+1;//just to add increament for getting tag which starts from 0, you can change it to zero as well
//UIImageView *imageViewInLoop = [self valueForKey:id];
//[imageViewInLoop setImage:[UIImage imageNamed:@"defaultphoto.jpg"]];
[((UIImageView*)[self.view viewWithTag:tagId])setImage:[UIImage imageNamed:@"defaultphoto.jpg"]];
}
警告是正确的,发布的代码正在将字符串设置为图像视图的值,在这里:
UIImageView *imageViewInLoop = id;
^ ^
| this is a string
this is an image view
我们真正想要的是让循环获得一系列图像视图。如果我们知道图像视图的父级,知道它们的标签(1,2,3 ...),并且这些标签在视图层次结构中是唯一的,那么这很容易。
。否则,您可能最终会设置其他视图的图像,并且如果该其他视图不是图像视图,则您的应用将崩溃。for (NSInteger i = 0; i < 3; i++){ UIImageView *imageViewInLoop = (UIImageView *)[self.view viewWithTag:i]; imageViewInLoop.image = [UIImage imageNamed:@"defaultphoto.jpg"]; }
viewWithTag:返回具有给定标签的接收者的后代视图。 确保层次结构中没有其他视图具有标签1,2,3