Почему этот код не рисует полилинию в MKMapView

У меня есть следующий код, с помощью которого я пытаюсь нарисовать полилинию между набором координат (которые верны, поскольку я также использую их для добавления булавок на карту, и они отлично работают).

Я вызываю метод рисования, чтобы инициировать рисование следующим образом (массив в вызове метода содержит необходимые координаты):

 [self drawRoute:[[transportData objectForKey:@"19"] objectForKey:@"stops"]];

Это фактический метод, который должен рисовать линию на карте (selectedRoute — это объект MKPolyline):

- (void)drawRoute:(NSArray *)routePointsArray {
if (selectedRoute) {
    [mapView removeOverlay:selectedRoute];
    selectedRoute = nil;
}

CLLocationCoordinate2D routeCoordinates[routePointsArray.count];
for (int i = 0; i < routePointsArray.count; i++) {
    float latitude = [[[routePointsArray objectAtIndex:i] objectForKey:@"lat"] floatValue];
    float longitude = [[[routePointsArray objectAtIndex:i] objectForKey:@"lon"] floatValue];
    CLLocationCoordinate2D routePoint =  CLLocationCoordinate2DMake(latitude, longitude);
    routeCoordinates[i] = routePoint;
}

selectedRoute = [MKPolyline polylineWithCoordinates:routeCoordinates count:routePointsArray.count];
[mapView addOverlay:selectedRoute];
[mapView setVisibleMapRect:[selectedRoute boundingMapRect]];
}

А это мой делегат:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
MKPolylineRenderer *routeLineView = [[MKPolylineRenderer alloc] initWithPolyline:selectedRoute];

if(overlay == selectedRoute)
{
    if(nil == routeLineView)
    {
        routeLineView = [[MKPolylineRenderer alloc] initWithPolyline:selectedRoute];
        routeLineView.fillColor = [UIColor redColor];
        routeLineView.strokeColor = [UIColor redColor];
        routeLineView.lineWidth = 5;

    }

    return routeLineView;
}

return nil;
}

Я как бы сузил его до того, что массив routeCoordinates не заполняется координатами, но я не понимаю, почему.

Кроме того, если вы обнаружите какие-либо ошибки в коде, я был бы очень признателен, если бы вы указали мне на них (возможно, с решением), поскольку я только изучаю эту часть iOS и могу использовать любую помощь, которую я могу получить.


person Gergely Kovacs    schedule 08.05.2018    source источник
comment
Вы создаете пустой routeLineView, но затем сравниваете его с nil (который не будет) перед добавлением строки наложения.   -  person Paulw11    schedule 09.05.2018
comment
Да, я не совсем понимаю эту часть. Но вы правы, если я уберу это условие, линия будет проведена.   -  person Gergely Kovacs    schedule 09.05.2018


Ответы (1)


У вас есть ошибка в вашем методе rendererForOverlay.

Первое, что он делает, это назначает экземпляр MKPolylineRenderer для routeLineView, но позже вы фактически добавляете наложение, только если routeLineView является nil, чего не будет.

Удалите строку, которая присваивает начальное значение routeLineView.

person Paulw11    schedule 08.05.2018
comment
Если я удалю строку, компилятор выдаст мне ошибку использования необъявленного идентификатора. - person Gergely Kovacs; 09.05.2018
comment
Вам нужно сохранить декларацию, но удалить инициализацию. - person Paulw11; 09.05.2018
comment
Хорошо, это работает таким образом. Однако это поднимает вопрос, зачем мне вообще нужно условие nil, поскольку routeLineView всегда будет nil. Я не понимаю логики этого условия. Если бы вы могли предоставить мне правильно работающий метод rendererForOverlay, который также соответствует рекомендациям Apple, я приму ваш ответ. Я основывал свой код на этом ответе: stackoverflow.com/questions/10598322/ - person Gergely Kovacs; 09.05.2018
comment
Обратите внимание, что в этом ответе они используют свойство, а не локальную переменную, поэтому они проверяют, что наложение еще не показано. - person Paulw11; 09.05.2018