Ошибка инициализации MKPolygon. Отсутствует аргумент для параметра «interiorPolygons» при вызове/дополнительный аргумент при вызове.

Я пытаюсь преобразовать код Objective-C в справочник MapKit MKPolygon в Листинг 6-9 в Swift.

Когда я вызываю функцию, используя

 init(coordinates:count:)

init функция, я получаю сообщение об ошибке:

Отсутствует аргумент для параметра «interiorPolygons» при вызове

Когда я вызываю функцию с аргументом interiorPolygons, я получаю сообщение об ошибке:

Дополнительный аргумент в вызове

Вот код, который я использую.

 var points: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]()

 points[0] = CLLocationCoordinate2DMake(41.000512, -109.050116)
 points[1] = CLLocationCoordinate2DMake(41.002371, -102.052066)
 points[2] = CLLocationCoordinate2DMake(36.993076, -102.041981)
 points[3] = CLLocationCoordinate2DMake(36.99892, -109.045267)

 var poly: MKPolygon = MKPolygon(points, 4)

 poly.title = "Colorado"
 theMapView.addOverlay(poly)

ОБНОВЛЕНИЕ:

 points.withUnsafePointerToElements() { (cArray: UnsafePointer<CLLocationCoordinate2D>) -> () in
            poly = MKPolygon(coordinates: cArray, count: 4)
        }

кажется, избавляется от ошибки компилятора, но все еще не добавляет оверлей.


person Jontonsoup    schedule 04.08.2014    source источник


Ответы (1)


Проблемы с:

var poly: MKPolygon = MKPolygon(points, 4)

заключаются в том, что он не дает метки аргументов для инициализатора и не передает points в качестве указателя.

Измените строку на:

var poly: MKPolygon = MKPolygon(coordinates: &points, count: 4)


(Версия points.withUnsafePointerToElements... в вашем обновлении также будет работать.)


Также обратите внимание, что var points: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]() создает пустой массив. Выполнение points[0] = ... должно вызвать ошибку во время выполнения, так как массив не имеет начальных элементов. Вместо этого добавьте координаты в массив, используя points.append():

points.append(CLLocationCoordinate2DMake(41.000512, -109.050116))
points.append(CLLocationCoordinate2DMake(41.002371, -102.052066))
points.append(CLLocationCoordinate2DMake(36.993076, -102.041981))
points.append(CLLocationCoordinate2DMake(36.99892, -109.045267))

или просто объявить и инициализировать вместе:

var points = [CLLocationCoordinate2DMake(41.000512, -109.050116),
              CLLocationCoordinate2DMake(41.002371, -102.052066),
              CLLocationCoordinate2DMake(36.993076, -102.041981),
              CLLocationCoordinate2DMake(36.99892, -109.045267)]


Если вы по-прежнему не видите оверлей, убедитесь, что вы реализовали метод делегата rendererForOverlay (и установили или подключили свойство delegate представления карты):

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if overlay is MKPolygon {
        var polygonRenderer = MKPolygonRenderer(overlay: overlay)
        polygonRenderer.fillColor = UIColor.cyanColor().colorWithAlphaComponent(0.2)
        polygonRenderer.strokeColor = UIColor.blueColor().colorWithAlphaComponent(0.7)
        polygonRenderer.lineWidth = 3
        return polygonRenderer
    }

    return nil
}


Несвязанный: вместо вызова массива points лучше использовать coordinates, поскольку points подразумевает, что массив может содержать MKMapPoint структур, которые инициализатор (points:count:) принимает в качестве первого аргумента.

person Community    schedule 05.08.2014
comment
Спасибо! Мой ответ технически решил мою проблему, но ваш ответ был гораздо более подробным и с более четким кодом. - person Jontonsoup; 07.08.2014