NSSet containsObject 不工作?
Posted
技术标签:
【中文标题】NSSet containsObject 不工作?【英文标题】:NSSet containsObject Not Working? 【发布时间】: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>
谢谢
【问题讨论】:
您创建一个新的注释对象并立即检查它是否已经在您的集合中。不可能。 【参考方案1】:如果您在创建 MapAnnotation
实例并将其添加到集合后从不更改它们的属性,则可以覆盖该类的 hash
和 isEqual:
方法以获得您在此处寻找的行为.
NSSet
使用这两种方法来测试对象;如果您重新定义 isEqual:
以比较 MapAnnontation
对象中包含的值,而不是对象本身的标识,则集合会将它们视为相等。
【讨论】:
完美,我想我是在尝试做某事而没有完全理解它。谢谢【参考方案2】:因为您正在创建一个新对象,并且因为它是新对象,所以它显然不在您的集合中。
您需要检查集合中的每个对象,看看它是否与您的新对象相等。
【讨论】:
什么?containObject:
不就是这样做的吗?
不,它会检查它是否包含这个特定的对象,而不是与这个对象等效的对象。
很确定你弄错了:***.com/questions/8410606/…以上是关于NSSet containsObject 不工作?的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 上加载 NSString 类失败,而 NSSet 和其他工作?