【问题标题】:Swift - Using a UISwitch to change Pin ColorSwift - 使用 UISwitch 更改引脚颜色
【发布时间】:2017-02-04 18:46:34
【问题描述】:

打开开关后,我想将引脚颜色从红色更改为紫色。到目前为止,我已经尝试过:

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

我的交换机连接到:

@IBOutlet weak var LegacySwitch: UISwitch!

我在 ViewDidLoad 中创建了我的图钉。 pin 的坐标来自另一个 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)

每当我运行应用程序时,图钉一直是红色的。当我使用断点告诉我它运行时遇到了 Action。

编辑 忘了说,我在 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
}

【问题讨论】:

  • 这是因为您不能简单地在 viewDidLoad 中添加任何定义(包括“注释”)并期望在视图控制器中的任何地方都引用它。要么将其定义为全局变量,要么遍历LocationMap 中的注释集合(如果可能)以更改所有这些。这与任何子视图都是一样的。
  • 我将它创建为 viewDidLoad 上方的变量。我刚刚编辑了我的问题以反映这一点。
  • if LegacySwitch.isOn == true 是多余的。无需包含== true。此外,三元运算符比那里的条件更适合。 annotation.pinTintColor = LegacySwitch.isOn ? .purple : .red
  • 您是否验证了您的SwitchChanged 代码正在执行?代码看起来不错 - 提供 pinTintColor 是正确的设置。顺便说一句,Swift 的命名约定建议函数和控件名称的首字母小写。
  • @dfd 开关更改的代码正在工作。大头针只是没有改变颜色。

标签: ios swift uiswitch mkpinannotationview


【解决方案1】:

区分:

  • 注解:轻量级特征包

  • 注释视图:您看到的内容,基于注释通过调用地图视图委托的mapView(_:viewFor:) 提供。

你改变的是前者,而不是后者。这方面的所有操作都发生在mapView(_:viewFor:) 中,但是您没有证明这一点——也没有任何特殊原因会因为您更改某个实例变量中的注释属性而调用它。您需要替换 map 中的注解,以便重新生成注解视图。

【讨论】:

  • 我查看了如何使用 mapView,但我不确定我是否正确使用了它。检查我的问题,了解我使用了什么
  • 那么 MyPointAnnotation 到底是为了什么?
  • 在尝试更改图钉颜色时,有人建议我创建 MyPointAnnotation。
  • 不管怎样,既然您已经表明您正在尝试在mapView(_:viewFor:) 中设置颜色,您所要做的就是在开始时设置一个断点,然后一步一步地遍历它,看看是什么正在发生。 if 子句是否会带您进入 .purple 分支?我敢打赌它永远不会,因为您已经创建了这个注释视图并且您没有做任何导致它重新生成的事情(正如我在回答中所说的那样)。
  • “是”是什么意思?如果你在mapView(_:viewFor:) 并进入.purple 分支,你会得到一个紫色的别针,不是吗?
猜你喜欢
  • 1970-01-01
  • 2020-06-28
  • 2010-12-15
  • 2012-10-03
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2014-12-12
相关资源
最近更新 更多