Search code examples
swiftsubview

Subview doesn't remove after calling from ViewDidLoad


I have added a UIBlurEffect with a function to load it before the data load from the server. I added a boolean parameter to active or deactivate it.

func addingEffectLayerWithSpinner(active: Bool){
    let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    if active {
        view.addSubview(blurEffectView)
    } else {
        //This one is not working
        blurEffectView.removeFromSuperview()
    }
}

and here in viewDidLoad, I pass false to the that function to remove the UIBlueEffect view, but it doesn't work, could you help me what is the problem.

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    addingEffectLayerWithSpinner(active: true)

    profile.showingProfile { result in
        switch result {
        case .success(_):
            // Sucesss response from server
            DispatchQueue.main.async {
                self.nameLabel?.text = nameOfUser!
                self.avatar?.downloaded(from: avatarUrl!)

                //This one is not working
                self.addingEffectLayerWithSpinner(active: false)
            }
            // failed response from server
        case .failure(let error):
            print(error)
        }

    }
}

Solution

  • let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    

    The problem is here. As every time the above blurEffectView is called, a new UIVisualEffectView is prepared which is different from what's presenting now.

    blurEffectView.frame = view.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    if active {
        view.addSubview(blurEffectView)
    } else {
        //This one is not working
        blurEffectView.removeFromSuperview()
    }
    

    So you may consider to save the blurEffectView as a property and then call to remove it.

    var  blurEffectView :  UIVisualEffectView!
    
    func addingEffectLayerWithSpinner(active: Bool){
    
    //introduce a false condition early: 
    if !active {  blurEffectView.removeFromSuperview()
     return
    } 
    
    let blurEffect = UIBlurEffect(style: UIBlurEffect.Style.light)
    
    blurEffectView = UIVisualEffectView(effect: blurEffect)
    //remove `let` here
    blurEffectView.frame = view.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    
        view.addSubview(blurEffectView)
    

    }