【问题标题】:NSSet containsObject Not Working?NSSet containsObject 不工作?
【发布时间】:2012-06-21 18:36:20
【问题描述】:

我正在尝试在将注释添加到数组之前检查它是否存在。 我不明白为什么 [visibleAnnotations containsObject:annotation] 总是返回 False。

MKMapRect mRect = self.locationView.visibleMapRect;
NSSet *visibleAnnotations =[self.locationView annotationsInMapRect:mRect];
NSLog(@"Annotation in Rect %@",visibleAnnotations);

for(NSArray * obj in JSON){
                coordinates.latitude=[[obj valueForKey:@"Latitude"] doubleValue];
                coordinates.longitude=[[obj valueForKey:@"Longitude"] doubleValue];
                NSString *title=[NSString stringWithFormat:@"%@",[obj valueForKey:@"DeviceId"]];
                MapAnnotation *annotation = [[MapAnnotation alloc] initWithTitle:title andCoordinate:coordinates] ;

                NSLog(@"New Annotation %@",annotation);

                if ([visibleAnnotations containsObject:annotation ]) {
                    //[addPins addObject:annotation];
                    NSLog(@"Contains obj");
                }
                [addPins addObject:annotation];
                [annotation release];
            }

缩放至仅显示 1 个注释。

 Annotation in Rect {(<MapAnnotation: 0x1cd80720>)}
 New Annotation <MapAnnotation: 0x1cd79410>

谢谢

【问题讨论】:

  • 您创建一个新的注释对象并立即检查它是否已经在您的集合中。不可能。

标签: objective-c mkmapview nsset


【解决方案1】:

如果您在创建 MapAnnotation 实例并将其添加到集合后从不更改它们的属性,则可以覆盖该类的 hashisEqual: 方法以获得您在此处寻找的行为.

NSSet 使用这两种方法来测试对象;如果您重新定义 isEqual: 以比较 MapAnnontation 对象中包含的值,而不是对象本身的标识,则集合会将它们视为相等。

【讨论】:

  • 完美,我想我是在尝试做某事而没有完全理解它。谢谢
【解决方案2】:

因为您正在创建一个新对象,并且因为它是新对象,所以它显然不在您的集合中。

您需要检查集合中的每个对象,看看它是否与您的新对象相等。

【讨论】:

  • 什么? containObject: 不就是这样做的吗?
  • 不,它会检查它是否包含这个特定的对象,而不是与这个对象等效的对象。
  • 很确定你弄错了:stackoverflow.com/questions/8410606/…
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多