我正在我的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初始化的变量。有什么办法吗?谢谢大家!
答案 0 :(得分:2)
您重新创建活动指示器,这就是为什么它不起作用的原因。
此外,您还存在过渡到新的viewController的问题,因此self.view
将不再包含活动指示器。
所以我建议您做的是创建另一个UIWindow
并放在上面,向其中添加一个视图和活动指示器,然后在调用stopLoading()
时,您会寻找{{1} },并删除整个UIWindow
(如果存在)。
答案 1 :(得分:2)
如果确定要在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()
}
}
答案 2 :(得分:1)
您可以将存储区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()
之后,也将其存储在内存中。)
答案 3 :(得分:0)
将唯一的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()
}
}
}