2017-02-04 6 views
0

Я хочу изменить цвет штыря от красного до фиолетового, как только переключатель включен. До сих пор я пытался:Swift - с помощью UISwitch для изменения цвета штекера

@IBAction func SwitchChanged(_ sender: Any){ 
    if LegacySwitch.isOn == true { 
    annotation.pinTintColor = .purple 
    } else { 
    annotation.pinTintColor = .red 
    } 
} 

Мой переключатель связан с:

@IBOutlet weak var LegacySwitch: UISwitch! 

Я создал свой палец в моей ViewDidLoad. Координаты штыря поступают из другого ViewController.

//Map Stuff 
    let Coordinates = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
    annotation.coordinate = Coordinates 
    LocationMap.addAnnotation(annotation) 
    let center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)) 
    self.LocationMap.setRegion(region, animated: true) 

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

EDIT Я забыл упомянуть, я создал переменную аннотации над ViewDidLoad.

var annotation = MyPointAnnotation() 

У меня также есть MKPointAnnotation класса

class MyPointAnnotation: MKPointAnnotation { 
    var pinTintColor: UIColor? 
} 

вещи, которые не работали:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin") 
    if LegacySwitch.isOn { 
     annotationView.pinTintColor = .purple 
    } else { 
     annotationView.pinTintColor = .red 
    } 

    return annotationView 
} 
+0

Это потому, что вы не можете просто добавить что-либо * определенное * в viewDidLoad (включая «аннотацию») и ожидать ссылки на него повсюду в контроллере представления. Либо определите его как глобальную переменную, либо зациклируйте коллекцию аннотаций в «LocationMap» (если возможно), чтобы изменить все из них. Это то же самое с любым подзоном. – dfd

+0

Я создал его как переменную над viewDidLoad. Я отредактировал свой вопрос, чтобы отразить это сейчас. –

+0

'if LegacySwitch.isOn == true' является избыточным. Не нужно включать '== true'. Также тройной оператор будет лучше, чем если бы он был условным. 'annotation.pinTintColor = LegacySwitch.isOn? .purple: .red' –

ответ

2

Различать:

  • A п аннотацию: легкий пучок характеристик

  • аннотацию вид: что вы см, поставляемый на основе аннотаций с помощью вызова карты вид делегата mapView(_:viewFor:).

Вы меняете прежний, но не последний. Все действия в этом отношении происходят в mapView(_:viewFor:), но вы не показали этого - и не существует какой-либо конкретной причины, почему он будет вызван только потому, что где-то вы меняете свойство аннотации, сидевшего в переменной экземпляра. Вам нужно, чтобы заменил аннотацию на карте , чтобы получить регенерацию аннотации.

+0

Я искал, как использовать mapView, но я не уверен, что использовал его правильно. Проверьте мой вопрос, что я использовал –

+0

Так что же такое MyPointAnnotation даже для? – matt

+0

При попытке изменить цвет булавки кто-то предложил создать MyPointAnnotation. –