Как мне отличить несколько разных оверлеев MKPolygon, чтобы я мог присвоить каждому из них разные свойства?

Единственный способ, который я обнаружил, чтобы различать MKPolygon, — это использовать свойство типа MKPolygon.version(Int: Int). Я могу установить это на 1,2,3 и т. д. и дать каждому свой цвет (например). Я хотел расширить MKPolygon, чтобы добавить тег, но расширения Swift не могут добавлять сохраненные свойства. Мне неудобно использовать MKPolygon.version (а стоит ли?). Есть ли способ лучше?


person KeithRussell    schedule 15.08.2016    source источник
comment
Попробуйте создать подкласс MKPolygon   -  person David Berry    schedule 15.08.2016
comment
Сработало на славу! Спасибо @DavidBerry. На самом деле я создал... статический идентификатор var = Blue и т.д., а затем в методе mapView(_:rendererForOverlay:) я использовал... if let overlay = overlay as? MyPolygon && MyPolygon.identifier == Синий. теперь можно добавлять несколько полигонов разных цветов и реквизитов.   -  person KeithRussell    schedule 16.08.2016


Ответы (2)


Подкласс MKPolygon и поместите туда свои пользовательские свойства:

class MyPolygon: MKPolygon {
    var identifier: String?
}

Затем в методе mapView(_:rendererForOverlay:) преобразуйте его в свой класс:

func mapView(_ mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    if let overlay = overlay as? MyPolygon {
        let identifier = overlay.identifier
        // Do stuffs....
    }
}

(Я не рядом с Xcode, а сайт документации Apple переключается между Swift 2 и Swift 3, поэтому некоторые объявления функций могут не совпадать)

person Code Different    schedule 15.08.2016
comment
Если вы можете указать значение по умолчанию или использовать необязательное, это нормально. В противном случае вам придется определить инициализаторы для этого, что не так просто, учитывая, что MKPolygon имеет только удобные инициализаторы. В итоге я создал подкласс MKOverlay, чтобы добавить свои поля. Когда меня спрашивают об рендерере этого наложения, я генерирую MKPolygonRenderer. - person Jason Campbell; 29.04.2021

Эй, я знаю, что это было некоторое время назад, но для тех, кому интересно, вам совершенно не нужно создавать подкласс MKPolygon для достижения этого. Я пытался это сделать и столкнулся с некоторыми проблемами. Я уверен, что их можно было решить так или иначе, но я решил сделать словарь типа [Int : String]. Когда вы изначально создаете многоугольник, используйте его hashValue в качестве ключа словаря и вставьте любой уникальный идентификатор, который вы хотите (вы также можете использовать [Int: Int] или любое количество других типов). Затем позже, когда вам нужно выяснить, какой это полигон, просто верните это хэш-значение обратно в словарь, и вуаля, у вас есть свой уникальный идентификатор. Если это не ясно:

//vars/lets section:
var hashValueToUniqueID : [Int : String] = [:]

//section where polygons are generated
polygon: MKPolygon = generatePolygon() //this is a made up function
hashValueToUniqueID[polygon.hashValue] = "1234"

//section where you access polygons
var uniqueIDToFind = "1234"
if let overlays = mapView.overlays as? [MKPolygon] {
    for overlayItem in overlays {
        if hashValueToUniqueID[polygon.hashValue] == uniqueIDToFind {
            return polygon
        }
    }
}

Обратите внимание, что если вы удалите все полигоны и создадите их заново, вы должны повторно инициализировать словарь.

person Delimiter    schedule 11.03.2019