【问题标题】:Change UIImageView's Images Using For Loop使用 For 循环更改 UIImageView 的图像
【发布时间】:2020-06-17 15:20:59
【问题描述】:

我一直在尝试编写具有从 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 的警告之外,此代码没有出现任何错误。代码执行,但图像没有改变,并且没有任何内容打印到控制台。回复之前请注意图片和变量是正确的,因为我之前已经手动成功了。

【问题讨论】:

  • 你能添加正确的代码吗?您添加的代码不正确。 (在此代码中,您将 NSString 分配给 UIImageView,然后调用 setImage: 方法)
  • 对不起。但可能是我错误地表达了我的观点。创建后不要使用'imageViewInLoop'(UIImageView *imageViewInLoop 是局部变量,但在 [self.imageViewInLoop setImage:[UIImage imageNamed:@"defaultphoto.jpg"]]; 你使用一个属性,它是不同的变量) .要了解如何找到合适的 UIImageView,我们应该知道如何存储它们,或者它们在界面中的呈现方式。什么是行号?是表格,或者如果 UIImageViews 带有 UILabels,则只是垂直布局?
  • 同时将 NSString 分配给 UIImageView 不是一个好主意。这里的代码应该是这样的: UIImageView imageViewInLoop = [self getImageViewById:id];其中 getImageViewById: 返回 UIImageView
  • UIImageView 只是在屏幕上直接排序,没什么复杂的。只有 1 行,我只需要快速设置 3 个 UIImageViews,顺序并不特别或与它真正相关。
  • 我在 .h 文件中创建了 UIImageView,如下所示:@property (strong, nonatomic) IBOutlet UIImageView *c1;

标签: ios objective-c xcode uiimageview


【解决方案1】:

我可以看到您正在尝试通过在运行时构造一个表示它们的变量名称的字符串来访问您的三个图像视图。你不能这样做。可能最简单的方法是将您的三个图像视图放入NSArray;然后您可以通过枚举数组来访问每个图像视图:

NSArray *imageViews = @[self.c1,self.c2,self.c3];
for (UIImageView *imageView in imageViews) { 
    [imageViews setImage:[UIImage imageNamed:@"defaultphoto.jpg"]];
}

【讨论】:

  • 键值编码? (通过名称访问属性)它是 Objective-C :)。
  • 你可以,但与 tag 解决方案一样,你要求事情在运行时爆炸。
  • @Paulw11 - 这是一个很好的答案。 (包括我的……我不明白 OP 正在努力枚举现有的网点)。但我认为你反对 viewWithTag 的理由被夸大了。我们都会(我敢打赌,都有)设置一个 xib 来为对齐的视图(同质类型)提供一个共同的父级,几乎可以肯定是一个直接的父级。这样做在运行时既不会“慢”(来吧!)或危险。我相信你已经编写了大量的 iOS 代码。用 grep 获取 viewWithTag。你想和我打赌你没有找到它吗? :-)
  • 对于未来的读者来说,这是一个比 KVO 更好的答案,而且比使用标签更好。
  • 你欠我一美元。永远不应该有理由去按标签搜索视图。现在是晚上 9 点。你应该知道你的观点在哪里。
【解决方案2】:

要通过名称访问属性,请使用KeyValueCoding 通过属性名称获取imageView 使用valueForKey: 方法:

     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"]];

     }

【讨论】:

  • 如果在运行时出现类型不匹配会怎样?您将遇到无法识别的选择器崩溃。
  • 是的,但你可以做到。我从来没有为这是非常安全的方式感到难过。
  • @NMan 虽然此答案使用您的初始方法,但这不是我推荐的方法。
  • @Paulw11 完全正确,为了使代码安全,只需进行一些重构,例如使用 IBOutlecCollection 来存储指向所有图像视图的指针。使用键值编码不是很安全的方式。之后,您将拥有带有 imageViews 的数组。
【解决方案3】:

我知道了,这将按照您的要求工作。

只需为这三个 UIImageView 分配一个标签,如下所示

c1.tag=1;
c2.tag=2;
c3.tag=3;

然后你应该像下面的例子那样分配新的图像

for(int i = 0; i < 3; i++){ 

         //NSString *id = [NSString stringWithFormat:@"c%i" , i];
int tagId = i+1;//just to add increment 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"]]; 
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多