全局加载图标Swift

我正在我的extension.swift文件中制作一个正在加载的图标。我相信我们不需要仅使用任何第三方库来加载图标。但是我不能在扩展文件中存储任何值。如果我没有存储,它将看起来像

import UIKit

extension UIViewController {

func startLoading() {
    let activityIndicator: uiactivityIndicatorView = uiactivityIndicatorView()
    activityIndicator.center = self.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.style = .gray
    DispatchQueue.main.async {
        self.view.addSubview(activityIndicator)
    }
    activityIndicator.startAnimating()
    UIApplication.shared.beginIgnoringInteractionEvents()
}

func stopLoading() {
    let activityIndicator: uiactivityIndicatorView = uiactivityIndicatorView()
    DispatchQueue.main.async {
        activityIndicator.stopAnimating()
    }
    UIApplication.shared.endIgnoringInteractionEvents()
  }
}

因此,在您的视图控制器中,您可以直接调用startLoading()或stopLoading()。但是stopLoading不起作用。这是因为它没有访问由startLoading初始化的变量。有什么办法吗?谢谢大家!

zb415 回答:全局加载图标Swift

您重新创建活动指示器,这就是为什么它不起作用的原因。

此外,您还存在过渡到新的viewController的问题,因此self.view将不再包含活动指示器。

所以我建议您做的是创建另一个UIWindow并放在上面,向其中添加一个视图和活动指示器,然后在调用stopLoading()时,您会寻找{{1} },并删除整个UIWindow(如果存在)。

,

如果确定要在ViewController的视图上执行该实现,并且不会总是在控制器中加载活动指示器,则可以执行此操作。但是@Vollan的答案是执行此操作的正确方法,或者使用诸如SVProgressHUD之类的包(基本上会在其中创建带有加载程序的UIWindow)

class ViewController: ActivityIndicatorController {
   override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        startLoading()    
        DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
            self.stopLoading()
        }
    }
}


class ActivityIndicatorController: UIViewController {
    var activityIndicator: UIActivityIndicatorView?

    func startLoading() {
        activityIndicator = UIActivityIndicatorView()
        activityIndicator?.center = self.view.center
        activityIndicator?.hidesWhenStopped = true
        activityIndicator?.style = .gray
        DispatchQueue.main.async {
            if let activityIndicator = self.activityIndicator {
               self.view.addSubview(activityIndicator)
               activityIndicator.startAnimating()
            }
        }
        UIApplication.shared.beginIgnoringInteractionEvents()
    }

    func stopLoading() {
        DispatchQueue.main.async {
            self.activityIndicator?.stopAnimating()
            self.activityIndicator?.removeFromSuperview()
            self.activityIndicator = nil
        }
        UIApplication.shared.endIgnoringInteractionEvents()
    }
}
,

您可以将存储区activityIndicator用作静态变量,因此在两个调用中都将获得相同的对象:

extension UIViewController {

    static let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

    func startLoading() {
        let activityIndicator = UIViewController.activityIndicator
        activityIndicator.center = self.view.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.style = .gray
        DispatchQueue.main.async {
            self.view.addSubview(activityIndicator)
        }
        activityIndicator.startAnimating()
        UIApplication.shared.beginIgnoringInteractionEvents()
    }

    func stopLoading() {
        let activityIndicator = UIViewController.activityIndicator
        DispatchQueue.main.async {
            activityIndicator.stopAnimating()
            activityIndicator.removeFromSuperview()
        }
        UIApplication.shared.endIgnoringInteractionEvents()
      }
}

这种方法的缺点是,即使您隐藏了该activityIndicator(在调用stopLoading()之后,也将其存储在内存中。)

,

将唯一的tag与您的UIActivityIndicatorView相关联。
stopLoading()中,使用viewWithTag(_:)查找活动指示器视图,然后在其上调用stopAnimating

extension UIViewController {
    static var activityIndicatorTag = 12345

    func startLoading() {
        stopLoading()

        let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
        activityIndicator.tag = UIViewController.activityIndicatorTag
        activityIndicator.center = view.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.style = .gray

        DispatchQueue.main.async {
            self.view.addSubview(activityIndicator)
            activityIndicator.startAnimating()
        }
    }

    func stopLoading() {
        let activityIndicator = view.viewWithTag(UIViewController.activityIndicatorTag) as? UIActivityIndicatorView
        DispatchQueue.main.async {
            activityIndicator?.stopAnimating()
            activityIndicator?.removeFromSuperview()
        }
    }
}
本文链接:https://www.f2er.com/3153932.html

大家都在问