我是Xcode的新手。我正在开发一个车辆跟踪应用程序,我需要同时显示更多的注释点。为此,我需要将坐标存储在数组中,但它显示错误:Sending CLLocationCoordinate2D to parameter of incompatible type
我的代码是:
NSString *urlMapString=[NSString stringWithFormat:@"http://logix.com/logix_webservice/mapvehiclelist.php?uid=20&format=json"];
NSURL *urlMap=[NSURL URLWithString:urlMapString];
NSData *dataMap=[NSData dataWithContentsOfURL:urlMap];
if(dataMap!=NULL){
NSError *errorMap;
NSMutableArray *coordinates = [[NSMutableArray alloc]init];
NSDictionary *jsonMap = [NSJSONSerialization JSONObjectWithData:dataMap options:kNilOptions error:&errorMap];
NSArray *resultsMap = [jsonMap valueForKey:@"posts"];
for(int count=1;count<resultsMap.count;count++)
{
NSDictionary *resMap = [[resultsMap objectAtIndex:count]valueForKey:@"post"];
NSString *latOrgstring =[resMap valueForKey:@"latitude"];
latitude=[latOrgstring doubleValue];
NSString *longitudeString=[resMap valueForKey:@"longitude"];
longitude=[longitudeString doubleValue];
//Center
CLLocationCoordinate2D center;
center.latitude=latitude;
center.longitude=longitude;
[coordinates addObject:center]; //here it shows the error
}
}
请建议我解决这个问题 谢谢......
答案 0 :(得分:2)
CLLocationCoordinate2D center
不是一个对象。您只能在NSArray中存储对象。
请使用CLLocation
。
CLLocation *location = [[CLLocation alloc] initWithLatitude:lat longitude:lon];
答案 1 :(得分:2)
如前所述,您只能将对象添加到NSArray
。
CLLocationCoordinate2D
不是对象 - 它是一个C结构。
您发布的代码有一个解决方案:
创建一个NSDictionary
,将纬度和经度作为键/值对,并将生成的字典对象添加到数组中。
另一种方法是创建CLLocation
,如另一个答案中所示。
第三个想法是@trojanfoe先前回答的是将结构包装在NSValue
中。
然而,请注意there is a convenient NSValue
addition specifically for MapKit添加了这两个有用的辅助方法:
valueWithMKCoordinate:
返回NSValue
给出CLLocationCoordinate2D
MKCoordinateValue
,为CLLocationCoordinate2D
NSValue
有关示例,请参阅How to store CLLocationCoordinate2D?。
最后(至少在这个答案中)我会强烈推荐的替代方法,而不是以上所有这些......
MKAnnotation
协议,并且不仅具有坐标(作为CLLocationCoordinate2D
属性)而且还具有< em>与坐标相关的所有其他信息?该类将是NSObject<MKAnnotation>
的子类。MKMapView
,因为它们会实现MKAnnotation
。答案 2 :(得分:1)
CLLocationCoordinate2D是一个C结构,所以你需要先将它放在NSValue容器中。
NSValue对象是单个C或Objective-C的简单容器 数据项。它可以包含任何标量类型,如int,float和 char,以及指针,结构和对象id引用。使用 此类用于处理集合中的此类数据类型(例如 NSArray和NSSet),键值编码和其他需要的API Objective-C对象。
[coordinates addObject:[NSValue value:&coordinate withObjCType:@encode(CLLocationCoordinate2D)]];
答案 3 :(得分:1)
试试这个
CLLocationCoordinate2D new_coordinate = CLLocationCoordinate2DMake(latitude, longitude);
[points addObject:[NSValue valueWithMKCoordinate:new_coordinate]];
或者
CLLocation *location = [[CLLocation alloc] initWithLatitude:lat longitude:lon];
[coordinates addObject: location];
你不能直接向mapview添加坐标,这意味着在Mapview上放置MKAnnotation,而不是将坐标带入数组吗?
见下面我评论了行
for(int count=1;count<resultsMap.count;count++)
{
NSDictionary *resMap = [[resultsMap objectAtIndex:count]valueForKey:@"post"];
NSString *latOrgstring =[resMap valueForKey:@"latitude"];
latitude=[latOrgstring doubleValue];
NSString *longitudeString=[resMap valueForKey:@"longitude"];
longitude=[longitudeString doubleValue];
//Center
CLLocationCoordinate2D center;
center.latitude=latitude;
center.longitude=longitude;
-----------------------------------------
////// Annotation is MKAnnotation Subclass
Annotation * cartAnn = [Annotation new];
cartAnn.coordinate = center;
[self.mapView addAnnotation: cartAnn];
----------------------------------------------------
/////// [coordinates addObject:center]; //here it shows the error
}