4

このコードを使用して、1 つのグループの線を描画しています。

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];

そして、それはから来る行の1つのグループに対して機能していますが、今ではおそらく次のような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

2つの問題があります:提供されたコードのバグと例外です。

コードのバグ

構造の構築を完了する前に、すべてのsumaCountポイントにオーバーレイを追加しますpuntitos(たとえば、最初addOverlayに呼び出された場合は、ポイントのみを追加しまし[a1 count]た)。また、、、およびはすべてのアイテムであるa1と想定しています。それらを接続する場合は、次のことを行う必要があります。a2a3rutas

  • addOverlayループから抜け出します。と
  • a1、、、a2およびをa3使用しないでくださいrutassumaCount

したがって、本当に3つの行のグループを結合したい場合は、次のようになります。

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];

3つの別々の行グループを処理している場合は、次のことを行う必要があります。

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

そのエラーが実際に示されているコードから発生している場合は、割り当てが解除された変数のインスタンスを使用している可能性があります。

一度に複数のオーバーレイを追加する場合は、一度に 1 つの参照しか保持できない routeLineおよびプロパティの使用を停止する必要があります。routeLineView

MKPolylineandMKPolylineView変数をローカルで宣言して作成します。

コードの 2 番目のセクションの主な問題は、配列を除いてaddOverlayそれぞれarrayを呼び出し、すべてのオブジェクトからの値が蓄積され続けることです (たとえば、オーバーレイ 1 は単に firstであり、オーバーレイ 2 は first と second の組み合わせなどです)。 )。rutaspuntitossumaCountarrayarrayarray

arrayのそれぞれに個別のオーバーレイが必要な場合は、それぞれrutas宣言して初期化する必要がありますpuntitos(つまり、最初の for ループ内に配置します)。次に例を示します。sumaCount array

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オブジェクトを組み合わせた単一のオーバーレイが必要な場合は、メインの for ループのMKPolylineに作成とを配置します (メインの for ループの前に宣言と初期化を保持します)。例えば:addOverlay puntitossumaCount

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];


では、 andを使用しないviewForAnnotationようにコードを変更することを忘れないでください (混乱を避けるために、これらを削除する必要があります)。例えば:routeLinerouteLineView

- (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 に答える