Search code examples
swiftviewuiactivityindicatorview

Subview Not Removing after Several "Remove View" Methods


I have this nice function that adds an activity indicator view, with a regular view behind it. When I add it, it adds fine. The problem is, when I try to remove it, nothing happens. I've tried: .removeFromSuperview, .isHidden = true and putting these methods in the main queue:

DispatchQueue.main.async() {
                alertView.alpha = 0
                alertView.removeFromSuperview()
            activityIndicator.removeFromSuperview()
            alertView.isHidden = true
            activityIndicator.isHidden = true
            }

I don't know what other methods to try...It seems all the other questions like this have one of the methods that I have as a solution. The function uses a boolean to determine whether or not to stop the activityIndicator. Here is my code:

static func showLoadingView(inViewController: UIViewController, turning: Bool){

        let activityIndicator = UIActivityIndicatorView()
        let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35))
        if(turning){
        alertView.backgroundColor = UIColor(displayP3Red: 230, green: 230, blue: 230, alpha: 0.8)
        alertView.layer.cornerRadius = 5
        activityIndicator.center = alertView.center
        inViewController.view.addSubview(alertView)
        activityIndicator.activityIndicatorViewStyle = .gray
        activityIndicator.startAnimating()
        alertView.alpha = 0
        activityIndicator.backgroundColor = UIColor.lightGray
        alertView.center = inViewController.view.center

        alertView.addSubview(activityIndicator)
        alertView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
        UIView.animate(withDuration: 0.4) {
            alertView.alpha = 1
            alertView.transform = CGAffineTransform.identity
        }
        }
        ///////
        else {
            activityIndicator.stopAnimating()
                alertView.transform = CGAffineTransform.init(scaleX: 1.3, y:1.3)
            DispatchQueue.main.async() {
                alertView.alpha = 0
                alertView.removeFromSuperview()
            activityIndicator.removeFromSuperview()
            alertView.isHidden = true
            activityIndicator.isHidden = true
            }
            print("Done")

        }
    }

Solution

  • You declared alertView which is out of scope when you called false.As a result, your call could not identify the alertView instance.

    You can solve this issue in tow ways:

    1. Declare your alertView outside of the function as a static.

      static let activityIndicator = UIActivityIndicatorView()
      static let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35))
      static func showLoadingView(inViewController: UIViewController, turning: Bool){}
      
    2. In false case: find the subview using restorationIdentifier and remove.

      static func showLoadingView(inViewController: UIViewController, turning: Bool){
      if(turning){
          let activityIndicator = UIActivityIndicatorView()
         let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35))
          alertView.restorationIdentifier = "myalert"
      
          alertView.backgroundColor = UIColor(displayP3Red: 230, green: 230, blue: 230, alpha: 0.8)
          alertView.layer.cornerRadius = 5
          activityIndicator.center = alertView.center
          inViewController.view.addSubview(alertView)
          activityIndicator.activityIndicatorViewStyle = .gray
          activityIndicator.startAnimating()
          alertView.alpha = 0
          activityIndicator.backgroundColor = UIColor.lightGray
          alertView.center = inViewController.view.center
      
          alertView.addSubview(activityIndicator)
          alertView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
          UIView.animate(withDuration: 0.4) {
              alertView.alpha = 1
              alertView.transform = CGAffineTransform.identity
          }
      }
          ///////
      else {
          for view in inViewController.view.subviews {
              if (view.restorationIdentifier == "myalert") {
                  print("I FIND IT");
                  (view as! UIView).removeFromSuperview();
              }
          } 
       }
      }