几个“删除视图”方法后子视图不删除

时间:2018-04-02 00:59:30

标签: swift view uiactivityindicatorview

我有一个很好的功能,它添加了一个活动指示器视图,后面有一个常规视图。当我添加它,它添加罚款。问题是,当我尝试删除它时,没有任何反应。我试过了: .removeFromSuperview.isHidden = true并将这些方法放在主队列中:

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

我不知道还有哪些方法可以尝试......似乎所有其他问题都有我作为解决方案的方法之一。该函数使用布尔值来确定是否要停止activityIndi​​cator。这是我的代码:

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")

        }
    }

1 个答案:

答案 0 :(得分:1)

当您调用false时,您声明了 alertView ,这超出了范围。因此,您的调用无法识别alertView实例。

您可以通过两种方式解决此问题:

  1. 将函数外的 alertView 声明为静态。

    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. 在错误的情况下:使用 restorationIdentifier 找到子视图并删除。

    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();
            }
        } 
     }
    }