Как удалить программно созданные UIViews из superview

#swift

#swift

Вопрос:

Я хотел реализовать наложение загрузки, пока у меня загружается контент из вызова API, однако, когда я захожу, чтобы закрыть представление; У меня нет успеха.

 func viewLoading(show:Bool, boxView: UIView, error: Bool, errorMessage: String){
    let myNewView=UIView(frame: CGRect(x: 0, y: 0, width: boxView.frame.width, height: boxView.frame.height))

    if show{
        // Change UIView background colour
        myNewView.backgroundColor = UIColor.black.withAlphaComponent(0.75)
        myNewView.isOpaque = false
        // Add rounded corners to UIView
        myNewView.layer.cornerRadius = boxView.layer.cornerRadius

        let activityView = UIActivityIndicatorView(style: .whiteLarge)
        activityView.center = myNewView.center

        activityView.startAnimating()

        boxView.addSubview(myNewView)
        myNewView.addSubview(activityView)
    }else{
        print("Done")
        DispatchQueue.main.async(execute: { () -> Void in
            myNewView.removeFromSuperview()
            self.view.bringSubviewToFront(boxView)
        })
        myNewView.isHidden = true
    }
}
  

Ни один из вариантов после else не сработал, и я запутался в решении.

Редактировать: я хочу, чтобы одна и та же функция (ы) для размещения трех разных представлений в одном контроллере представления.

Комментарии:

1. Вы каждый раз создаете новый myNewView. Таким образом, вы не можете удалить существующий myNewView из его superview

Ответ №1:

Переместитесь myNewView за пределы viewLoading области действия функции, и лучше создать отдельные методы с их собственными обязанностями, например, так:

 class ViewController: UIViewController {
    var loaderView: UIView?

    func showLoading(boxView: UIView, error: Bool, errorMessage: String) {
        if (self.loaderView != nil) {
            self.hideLoading()
        }

        let newView = UIView(frame: CGRect(x: 0, y: 0, width: boxView.frame.width, height: boxView.frame.height))
        newView.backgroundColor = UIColor.black.withAlphaComponent(0.75)
        newView.isOpaque = false
        // Add rounded corners to UIView
        newView.layer.cornerRadius = boxView.layer.cornerRadius

        let activityView = UIActivityIndicatorView(style: .whiteLarge)
        activityView.center = newView.center

        activityView.startAnimating()

        boxView.addSubview(newView)
        newView.addSubview(activityView)
        self.loaderView = newView
    }

    func hideLoading() {
        guard
            let loaderView = self.loaderView,
            let boxView = loaderView.superview
        else { return }

        DispatchQueue.main.async {
            loaderView.removeFromSuperview()
            self.view.bringSubviewToFront(boxView) // need this?
            self.loaderView = nil
        }
    }
}
  

Ответ №2:

Вы создаете новое представление каждый раз, когда вызывается этот метод, а затем пытаетесь удалить это вновь созданное представление. Вместо этого вы должны сохранять ссылку на представление при его отображении и вызывать removeFromSuperview этот экземпляр, когда вам нужно его скрыть.

Ответ №3:

Проверьте это..

CommonMethods.swift

 import UIKit

class CommonMethods: UIViewController {

static let actInd: UIActivityIndicatorView = UIActivityIndicatorView()
static let container: UIView = UIView()
static let loadingView: UIView = UIView()

static func showActivityIndicatory(uiView: UIView) {

        container.frame = uiView.frame
        container.center = uiView.center
        container.backgroundColor = UIColor(red:255/255, green:255/255, blue:255/255, alpha: 0.3)

        loadingView.frame = CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 80, height: 80))
        loadingView.center = uiView.center
        loadingView.backgroundColor = UIColor(red:44/255, green:44/255, blue:44/255, alpha: 0.7)
        loadingView.clipsToBounds = true
        loadingView.layer.cornerRadius = 10

        actInd.frame = CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: 40, height: 40))
        actInd.style =
            UIActivityIndicatorView.Style.whiteLarge
        actInd.center = CGPoint(x: loadingView.frame.size.width / 2, y: loadingView.frame.size.height / 2);
        loadingView.addSubview(actInd)
        container.addSubview(loadingView)
        uiView.addSubview(container)
        actInd.startAnimating()
    }

static func hideActivityIndicatory(uiView: UIView) {
        container.removeFromSuperview()
        actInd.stopAnimating()
    }
}
  

вызовите его из класса viewcontroller, например

 CommonMethods.showActivityIndicatory(uiView: self.view)
CommonMethods.hideActivityIndicatory(uiView: self.view)
  

Комментарии:

1. На самом деле это не решает мою проблему. У меня есть три отдельных поля. Вызов этой функции в первом окне работает нормально, но вызов ее во втором или третьем ничего не отображает.

2. вам нужно правильно указать раздел self.view. если это выше табличного представления, то в этом месте отображается IBOutlet tableview.