4

我正在使用此代码绘制一组线:

CLLocationCoordinate2D points[[routes count]];
for(int i = 0; i < self.routes.count; i++)
{
    CLLocation* location = [self.routes objectAtIndex:i];
    points[i] = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate
                                             .longitude);
}
self.routeLine = [MKPolyline polylineWithCoordinates: points count: [routes count]];
[self.mapView setVisibleMapRect: [self.routeLine boundingMapRect] animated: YES];
[self.mapView addOverlay:self.routeLine];

它适用于来自的一组行NSArray *routes,但现在我需要不止一组行,例如NSMutableArray *routes = { NSArray with routes , NSArray with other group like first example , another array }可能是这样的:

int sumaCount = [a1 count] + [a2 count] + [a3 count];
CLLocationCoordinate2D puntitos[sumaCount];
int c = 0;
for (NSArray *array in rutas)
{
    for (CLLocation *cada in array)
    {
        puntitos[c] = CLLocationCoordinate2DMake(cada.coordinate.latitude, cada.coordinate.longitude);
        c++;
    }
    self.routeLine = [MKPolyline polylineWithCoordinates: puntitos count: sumaCount];
    [self.mapView addOverlay: self.routeLine];
}

但我得到了这个例外:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***
 -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]: nil argument'
4

2 回答 2

2

有两个问题:您提供的代码中的错误和异常。

代码错误

sumaCount在完成结构的构建之前,您正在为所有点添加叠加层puntitos(例如,第一次addOverlay调用,您只添加了[a1 count]点)。您还假设a1,a2a3是 中的所有项目rutas。如果您希望它们连接,您应该:

  • 摆脱addOverlay循环;和
  • 不要使用a1, a2, and a3,而是通过迭代rutas来获得sumaCount

因此,如果您真的想将三组线路连接在一起,您可以:

int sumaCount = 0;
for (NSArray *array in rutas)
    sumaCount += [array count];
CLLocationCoordinate2D puntitos[sumaCount];

int c = 0;
for (NSArray *array in rutas)
{
    for (CLLocation *cada in array)
    {
        puntitos[c] = CLLocationCoordinate2DMake(cada.coordinate.latitude, cada.coordinate.longitude);
        c++;
    }
}

self.routeLine = [MKPolyline polylineWithCoordinates: puntitos count: sumaCount];
[self.mapView addOverlay: self.routeLine];

如果您正在处理三组单独的行,您应该:

for (NSArray *array in rutas)
{
    int sumaCount = [array count];
    CLLocationCoordinate2D puntitos[sumaCount];

    int c = 0;
    for (CLLocation *cada in array)
    {
        puntitos[c] = CLLocationCoordinate2DMake(cada.coordinate.latitude, cada.coordinate.longitude);
        c++;
    }
    MKPolyline routeLine = [MKPolyline polylineWithCoordinates: puntitos count: c];
    [self.mapView addOverlay: routeLine];
}

请注意,在后一个示例中,我使用的不是您的MKPolyline属性,而是本地变量。如果您需要保留这些MKPolyline对象的数组,请继续执行此操作,但出于上述代码的目的,您不需要它。坦率地说,在第一个例子中,我可能也倾向于给你一个局部MKPolyline变量。为什么要把它放在类属性中?!?

例外

以上修复了您列出的代码中的错误,但您的异常指向另一个问题。它可能是您的代码(因为您第一次尝试创建MKPolyline正在使用的sumaCount点,但只设置了其中的几个)。但是问题也可能在其他地方重置,因为异常不是您对代码错误的期望。您是否在代码的其他地方进行任何正则表达式匹配?如果您确信问题出在代码本身,您可以

NSLog(@"rutas=%@", rutas);

就个人而言,如果正则表达式问题是由此引起的,我会感到惊讶,但您原始问题中的代码肯定会导致一些意想不到的问题。我会修复代码,看看你的异常是否仍然发生。如果是这样,请添加此rutas日志语句,但更好的是,NSRegularExpression在您的项目中搜索并查看您可能在哪里使用它。您还可以打开异常断点(只需为所有异常打开它)。

于 2013-02-13T17:29:05.403 回答
1

如果该错误确实来自显示的代码,则您可能正在使用某个变量的已释放实例。

如果要一次添加多个叠加层,则应停止使用routeLineandrouteLineView属性,因为它一次只能保存一个引用。

在本地声明并创建一个MKPolylineMKPolylineView变量。

第二部分代码的主要问题是它调用addOverlay每个arrayinrutaspuntitos数组并sumaCount不断累积来自所有对象的值array(例如,叠加层 1 只是第一个array,叠加层 2 是 first 和 second 的组合array,等等)。

如果您想为每个arrayin单独叠加rutaspuntitos并且sumaCount应该为每个 array声明和初始化(即放在第一个 for 循环中)。下面是一个例子:

for (NSArray *array in rutas)
{
    int sumaCount = [array count];
    CLLocationCoordinate2D puntitos[sumaCount];
    int c = 0;

    for (CLLocation *cada in array)
    {
        puntitos[c] = CLLocationCoordinate2DMake(cada.coordinate.latitude, cada.coordinate.longitude);
        c++;
    }

    MKPolyline *arrayLine = [MKPolyline polylineWithCoordinates: puntitos count: sumaCount];
    [self.mapView addOverlay: arrayLine];
}


相反,如果您想要一个组合所有array对象的叠加层,请将MKPolyline创建和addOverlay 放在主 for 循环之后(并保留主 for 循环的声明和初始化puntitos以及sumaCount 之前)。例如:

int sumaCount = 0;
CLLocationCoordinate2D puntitos[sumaCount];
int c = 0;
for (NSArray *array in rutas)
{
    sumaCount = sumaCount + [array count];

    for (CLLocation *cada in array)
    {
        puntitos[c] = CLLocationCoordinate2DMake(cada.coordinate.latitude, cada.coordinate.longitude);
        c++;
    }
}

MKPolyline *rutasLine = [MKPolyline polylineWithCoordinates: puntitos count: sumaCount];
[self.mapView addOverlay: rutasLine];


viewForAnnotation中,请记住将代码更改为使用routeLineand routeLineView(您应该摆脱这些以避免混淆)。例如:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id < MKOverlay >)overlay
{
    MKPolylineView *pv = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease];
      //remove autorelease if not using ARC

    pv.strokeColor = [UIColor redColor];
    pv.lineWidth = 5;

    return pv;
}
于 2013-02-13T17:23:58.043 回答