【问题标题】:Checking whether two objects being used in two arrays are the same检查两个数组中使用的两个对象是否相同
【发布时间】:2014-11-13 07:00:06
【问题描述】:

我有两个数组,其中包括 5 张纯色背景图片。这是用于将图像放入数组的代码:

self.colorArray = @[
                    [UIImage imageNamed:@"orange_square"],
                    [UIImage imageNamed:@"purple_square"],
                    [UIImage imageNamed:@"red_square"],
                    [UIImage imageNamed:@"blue_square"],
                    [UIImage imageNamed:@"green_square"],
                    ];
self.iconColorArray = @[
                    [UIImage imageNamed:@"orange_icon"],
                    [UIImage imageNamed:@"purple_icon"],
                    [UIImage imageNamed:@"red_icon"],
                    [UIImage imageNamed:@"blue_icon"],
                    [UIImage imageNamed:@"green_icon"],
                    ];

如您所见,图像分别按照背景颜色排列。 (我对数组使用不同的图像,因为iconColorArray 被用于较小的UIImageView

应用程序随机更改两个UIImageViews 的图像。

我想要的是一个 if-else 语句来比较两个数组,看看是否使用了相同的 objectAtIndex。 Exp: 如果orange_square 用于一个UIImageView 并且orange_icon 用于另一个,则if-else 语句中的条件将返回true。

基本上回答我的问题,告诉我如何获取数组中UIImageView 使用的对象的索引。

编辑: 根据 Matt 的建议,我将代码更改为:

NSUInteger d = [self.colorArray indexOfObject:self.squareOne.image];
NSUInteger e = [self.iconColorArray indexOfObject:self.icon.image];

现在,我可以比较它们了。

【问题讨论】:

  • 为什么说“上面的代码没有意义”?什么没有意义?你试过了吗?当你这样做时发生了什么?
  • @matt 哦。对不起。我很着急,猜到我能做什么,并认为这是错误的。我将编辑问题

标签: objective-c arrays if-statement


【解决方案1】:

获取对象索引的方法是使用(等待它)indexOfObject:

问题在于,使用此方法的前提是可以比较此对象是否相等。我不知道 UIImage 是否可以;我比较怀疑,但你可以试试。

另一种可能是indexOfObjectIdenticalTo:;如果图像不是由图像视图复制而是对与数组中的图像相同的图像的实际引用,则此可能有效。

说了这么多,我该怎么办?他们都没有。我什至不会保留图像数组;这非常浪费内存,并且您的应用程序很可能在它启动之前就崩溃了。我要做的是保留图像的 names 数组;字符串很小,图像很大。为了进行比较,我将 UIImageView 子类化为具有name 属性,以便我可以分配名称和图像,现在问题很简单。

或者您甚至可以通过它们自己的视图控制器显示图像,并为视图控制器提供name 属性。事实上,我碰巧有一个这样做的例子:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch06p311pageController/ch19p626pageController/Pep.swift

事实上,如果您探索该项目的其余部分,您会发现我会继续执行您要求做的事情:要了解显示的 pep boy 是什么,我向 Pep 对象询问其boy字符串和我在 Pep boy 列表中查找它的索引

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch06p311pageController/ch19p626pageController/AppDelegate.swift

它在 Swift 中,所以我使用 find 而不是 indexOfObject:,但它相当于。

【讨论】:

  • 谢谢马特。我将使用数组,因为我在 Objective-C 方面没有那么丰富的经验。看看我的编辑^
【解决方案2】:

您可以创建第三个对象作为字典,其中图像方块名称名称是键是键。然后你的 colorArray 和 iconColorArray 可以从这个字典中派生出来。

self.imageMap = { @"orange_square" : @"orange_icon",
                  @"purple_square" : @"purple_icon" }

- (BOOL)squareUsed:(UIImage *)square isSameAsIcon:(UIImage *)iconUsed {
  for (NSString *key in self.imageMap) {
    if ([[UIImage imageNamed:key] isEqual:square]) {
      if ([UIImage imageNamed:self.imageMap[key]] isEqual:iconUsed]) {
        return YES;
      }
      // We matched the square and the icon didn't match.
      return NO;
    }
  }
  // We never matched the square. Assert?
  return NO;
}

【讨论】:

  • 谢谢,我会测试一下。但是有没有一种方法可以提取对象的索引值并将其与另一个进行比较?
  • 是的,您可以提取值。但是您在索引处的值不相等(除非 orange_square 和 orange_icon 真的是同一张图片),所以比较不起作用。
  • 图片是一样的。区别只是大小
  • 如果图像相同,为什么使用不同的名称?如果您使用相同的名称,那么您可以轻松比较名称(或图像对象)
  • 因为两个UIImageView的大小不同,并且约束在图片中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2012-06-23
  • 2014-12-06
  • 1970-01-01
  • 2021-01-17
相关资源
最近更新 更多