SashaZ
SashaZ

Reputation: 403

How to remove all subviews of a certain type

I have a pain map where I use location coordinates to plot where there has been pain. I can add the "dots" in a for in loop and they show up fine. However I cannot remove them before I instantiate them outside the for in loop. So every time I update the view it will plot new ones not ones on top of the old ones. What can I do?

This version adds the dots well but I cannot remove them outside as I cannot call dot.removeFromSuperview()

DispatchQueue.global(qos: .background).async {
      if let locationNotNilX = self.painDiagramAnalysisModel.painLocationXFor(days: self.daysChosen){
        x = locationNotNilX
        count = locationNotNilX.count
      }

      if let locationNotNilY = self.painDiagramAnalysisModel.painLocationYFor(days: self.daysChosen){
        y = locationNotNilY
      }

      let locationsArray = zip(x, y)
      print("zipped array \(locationsArray)")
      DispatchQueue.main.async {
        let dot = UIImageView()
        dot.removeFromSuperview()
        dot.image = nil
        for item in locationsArray {
          self.locationPainY = (diagramHeight * CGFloat(item.1)) + originY
          self.locationPainX = (diagramWidth * CGFloat(item.0)) + originX
          print(" locationX \(self.locationPainX) locationY  \(self.locationPainY)")
          dot.image = UIImage(named: "dot")
          dot.frame = CGRect(x: self.locationPainX - (dotDiameter / 4), y: self.locationPainY - (dotDiameter / 4), width: dotDiameter , height: dotDiameter)

          if count > 2 {
            dot.alpha = 0.6
          } else {
        dot.alpha = 1.0
          }
          dot.readingsPressedAnimation()

          self.view.addSubview(dot)
        }
      }
    }

This version removes the dot but there is only one dot (self hangs on to the dot and just instantiates it once in the for in loop.

let dot = UIImageView()
    dot.removeFromSuperview()
    dot.image = nil

    DispatchQueue.global(qos: .background).async {
       if let locationNotNilX = self.painDiagramAnalysisModel.painLocationXFor(days: self.daysChosen){
        x = locationNotNilX
        count = locationNotNilX.count
      }

      if let locationNotNilY = self.painDiagramAnalysisModel.painLocationYFor(days: self.daysChosen){
        y = locationNotNilY
      }

      let locationsArray = zip(x, y)
      print("zipped array \(locationsArray)")
      DispatchQueue.main.async {

        for item in locationsArray {
          self.locationPainY = (diagramHeight * CGFloat(item.1)) + originY
          self.locationPainX = (diagramWidth * CGFloat(item.0)) + originX
          print(" locationX \(self.locationPainX) locationY  \(self.locationPainY)")
          dot.image = UIImage(named: "dot")
          dot.frame = CGRect(x: self.locationPainX - (dotDiameter / 4), y: self.locationPainY - (dotDiameter / 4), width: dotDiameter , height: dotDiameter)

          if count > 2 {
            dot.alpha = 0.6
          } else {
            dot.alpha = 1.0
          }
          dot.readingsPressedAnimation()

          self.view.addSubview(dot)
        }
      }
    }

How can I add many instances of the dot and remove them outside the loop?

Upvotes: 3

Views: 795

Answers (1)

shallowThought
shallowThought

Reputation: 19602

Iterate over your maps subviews and remove all UIImageViews:

func removeDots() {
    for case let dot as UIImageView in yourPainMapView.subViews {
        dot.removeFromSuperView()
    }
}

In case you are using other UIImageView subViews you do not want to remove, subclass UIImageView (class MyDot:UIImage {...}):

for case let dot as MyDot in yourPainMapView.subViews

Upvotes: 7

Related Questions