2015-03-09 3 views
1

Как проверить, добавлена ​​ли полилиния на карту?Проверьте, существует ли наложение MKPolyline

Я попытался следующий код, но это не похоже на работу

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]; 
} 
+0

С помощью цикла for, вы не должны проверять наложения _all_ перед тем, как решить, добавлено ли оно или нет? Сейчас он решает, основываясь на результате первого наложения. Вторая попытка, вероятно, не работает, потому что «polu» не был добавлен исходным объектом. – Anna

+0

Можете ли вы помочь мне исправить метод? Должен ли я сравнивать массив наложений с массивом от self.mapview.overlays? – JMIT

ответ

1

Ток for цикл предполагает наложение существует или Безразлично» t существует, как только находит один другой оверлей, название которого не совпадает.

Но в этот момент цикл for может не проверять оставшиеся наложения (один из которых может быть наложением, который вы ищете).

Например:

  • Предположим, что уже 4 наложений на карте с названиями A, B, C и D.
  • Предположим накладку вы хотите проверить (polu) имеет название C.
  • Первая накладка проверил A. так как A не совпадает с 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]; 
} 


Во втором примере в вопросе, containsObject: будет работать только тогда, когда polu был исходный объект, который был дан в первый раз addOverlay был назван потому, что в этом случае, containsObject: будет сравнивать адреса указателей, а не свойство title наложений.

Смежные вопросы