问题
I am trying to check if the annotation exists before adding it to array. I can't figure out why [visibleAnnotations containsObject:annotation] always returns 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];
}
Zoomed to only show 1 annotation.
Annotation in Rect {(<MapAnnotation: 0x1cd80720>)}
New Annotation <MapAnnotation: 0x1cd79410>
Thanks
回答1:
If you never change the properties of your MapAnnotation
instances once they are created and added to the set, you could override the hash
and isEqual:
methods for that class to get the behavior you're looking for here.
NSSet
uses those two methods to test objects; if you redefine isEqual:
to compare the values contained in the MapAnnontation
objects, rather than the identity of the objects themselves, the set will take them to be equal.
回答2:
Because you are creating a new object, and because it is new, it clearly is not in your set.
You need to check each object in the set to see if it is equal to your new object instead.
来源:https://stackoverflow.com/questions/11144616/nsset-containsobject-not-working