2012-06-21 33 views
0

我想在将它添加到数组之前检查注释是否存在。 我想不通为什么[visibleAnnotations containsObject:annotation]总是返回False。NSSet containsObject Not Working?

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> 

感谢

+2

您创建一个新的注释对象,并立即检查它是否已经在您的设置中。这是没有办法的。 –

回答

3

如果在创建实例并将其添加到集合后,您决不会更改实例的属性,则可以覆盖该类的hashisEqual:方法以获取您在此处查找的行为。

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

+0

完美,我想我正在尝试做一些事情没有完全理解它。谢谢 – Brian

1

因为你正在创建一个新的对象,因为它是新的,它显然不是在你的设置。

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

+0

什么?那不是什么'containsObject:'做的? – Chuck

+0

不,它会检查它是否包含此特定对象,而不是与此对象等效的对象。 – lnafziger

+1

很确定你错了:http://stackoverflow.com/questions/8410606/does-nssets-containsobject-test-for-pointer-equality-or-value-equality – Chuck