2

ポリラインが既にマップに追加されているかどうかを確認するにはどうすればよいですか?

次のコードを試しましたが、うまくいかないようです

for (MKPolyline *feature1 in self.mapView.overlays) {

       NSLog(@"feature1.title: %@", feature1.title);
       NSLog(@"Polu.title: %@", polu.title);

       if (![feature1.title isEqualToString:polu.title]) {
             NSLog(@"NOT");
             [self.mapView addOverlay:polu];
       }
       else {
             NSLog(@"Already added");
       }
      }
     }

私もこれを試しました:

if (![self.mapView.overlays containsObject:polu]) {
    NSLog(@"NOT");
   [self.mapView addOverlay:polu];
}
4

1 に答える 1

2

現在のループは、タイトルが一致しない別のオーバーレイを見つけるforとすぐに、オーバーレイが存在するか存在しないと想定します。

しかし、その時点で、forループは残りのオーバーレイをチェックしていない可能性があります (そのうちの 1 つが探しているオーバーレイである可能性があります)。

例えば:

  • マップ上に、A、B、C、および D というタイトルのオーバーレイが既に 4 つあるとします。
  • 確認したいオーバーレイ ( polu) のタイトルが Cであるとします。
  • 最初にチェックされるオーバーレイは A です。A は C と一致しないため、既存のコードはすぐに C という名前の別のオーバーレイを追加します。
  • その後、forループは継続し、B を調べます。ここでも、B は C と一致しないため、既存のコードは C という名前の別のオーバーレイを追加します。
  • その後、ループが継続し、C を見て、「既に追加されました」とログに記録します。
  • 次にループが続き、D を見て、それが C と一致しないことを確認し、別のオーバーレイを追加します。


代わりに、一致するタイトルが見つかったときにループを停止し、一致するタイトルが見つからずにループが終了した場合は、オーバーレイ を追加します。

例:

BOOL poluExists = NO;

for (MKPolyline *feature1 in self.mapView.overlays) {

    NSLog(@"feature1.title: %@", feature1.title);
    NSLog(@"Polu.title: %@", polu.title);

    //STOP looping if titles MATCH...
    if ([feature1.title isEqualToString:polu.title]) {
        poluExists = YES;
        break;
    }
}

//AFTER the loop, we know whether polu.title exists or not.
//If it existed, loop would have been stopped and we come here.
//If it didn't exist, loop would have checked all overlays and we come here.
if (poluExists) {
    NSLog(@"Already added");
}
else {
    NSLog(@"NOT");
    [self.mapView addOverlay:polu];
}


問題の 2 番目の例では、最初に指定された元のオブジェクトが呼び出されたcontainsObject:場合にのみ機能します。この場合、オーバーレイのプロパティではなくポインター アドレスを比較するためです。poluaddOverlaycontainsObject:title

于 2015-03-09T18:49:50.330 に答える