2

我有一个从 ios 中的 sqlite db 填充的 mutablearray。我已经获得了正确加载和查看的注释。我的问题是如何编写一个循环来添加数组大小的注释。我尝试了以下代码并获取并显示数组中的最后一个条目

NSMutableArray *annotations=[[NSMutableArray alloc] init];
CLLocationCoordinate2D theCoordinate5;
MyAnnotation* myAnnotation5=[[MyAnnotation alloc] init];
for (int i = 0; i < _getDBInfo.count; i++) {

    dbInfo *entity = [_getDBInfo objectAtIndex:i];

    NSNumber *numlat=[[NSNumber alloc] initWithDouble:[entity.Latitude doubleValue]];
    NSNumber *numlon=[[NSNumber alloc] initWithDouble:[entity.Longitude doubleValue]];
    NSLog(@"%d",[_getDBInfo count]);
    la=[numlat doubleValue];
    lo=[numlon doubleValue];
    theCoordinate5.latitude=la;
    theCoordinate5.longitude=lo;

    myAnnotation5.coordinate=theCoordinate5;
    myAnnotation5.title=[NSString stringWithFormat:@"%@"entity.EntityNo];
    myAnnotation5.subtitle=[NSString stringWithFormat:@"%@",entity.EntityName]; 
    [mapView addAnnotation:myAnnotation5];
    [annotations addObject:myAnnotation5];
}

我想我的问题是如何根据数组中的计数创建并添加到我的视图注释对象中?

任何帮助深表感谢。

我是 iOS 和编程新手,所以请保持温和。

4

2 回答 2

3

你只有一个myAnnotation5对象。当您设置它的coordinate,title等时,您正在为该实例设置它,您碰巧已经添加了annotations多次。因此,每个条目都annotations将具有您设置的最后一组属性 - 因为每个条目annotations实际上都是同一个对象。

为了解决这个问题,您需要myAnnotation5在循环的每次迭代中重新创建对象,即

for (int i = 0; i < _getDBInfo.count; i++) {
    MyAnnotation* myAnnotation5=[[MyAnnotation alloc] init];
    ...
    myAnnotation5.coordinate=theCoordinate5;
    myAnnotation5.title=[NSString stringWithFormat:@"%@", entity.EntityNo];
    myAnnotation5.subtitle=[NSString stringWithFormat:@"%@", entity.EntityName];
    ...
    [mapView addAnnotation:myAnnotation5];
}

两个旁白:

  1. 我希望您正在使用 ARC 构建,否则您会左右泄漏内存。
  2. 由于MKMapView有一个-annotations属性,您可能没有理由保留自己的annotations数组 - 只需保留对mapView.
于 2012-05-14T17:23:51.517 回答
1

移动这一行:

MyAnnotation* myAnnotation5=[[MyAnnotation alloc] init];

在设置属性之前进入 for 循环myAnnotation5

现在的方式是,您只创建一个MyAnnotation对象并反复修改其属性。

于 2012-05-14T17:22:44.297 回答