将CLLocationCoordinate2D发送到Xcode 4.5中的不兼容类型my code的参数

时间:2014-07-24 06:39:52

标签: ios objective-c

我是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
      }
}

请建议我解决这个问题 谢谢......

4 个答案:

答案 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
  }