2012-06-21 35 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