gpt4 book ai didi

ios - swift UIActivityView stopAnimating() 不工作

转载 作者:行者123 更新时间:2023-11-28 10:11:59 27 4
gpt4 key购买 nike

在我的 UIImageView 子类中,我有一个 UIActivityIndi​​catorView 和一个下载图像的函数,定义如下:

class FooUIImageView: UIImageView {

var activityIndicator: UIActivityIndicatorView {
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .white)
activityIndicator.hidesWhenStopped = true
activityIndicator.center = CGPoint(x: self.frame.width/2, y: self.frame.height/2)
self.addSubview(activityIndicator)
return activityIndicator
}

func downloadImageFrom(url: URL, imageMode: UIViewContentMode) {

self.activityIndicator.startAnimating()
self.activityIndicator.stopAnimating()

contentMode = imageMode
if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) as? UIImage {
self.image = cachedImage
} else {
URLSession.shared.dataTask(with: url) { data, _, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async {
if let imageToCache = UIImage(data: data) {
self.activityIndicator.stopAnimating()
self.imageCache.setObject(imageToCache, forKey: url.absoluteString as NSString)
self.image = imageToCache
} else {
self.activityIndicator.stopAnimating()
self.image = nil
}
}
}.resume()
}

activityIndicator.stopAnimating()
}
}

当运行我的应用程序时,activityIndi​​cator 开始加载 - 然后最终显示图像。但是,activityIndi​​cator 会保留在屏幕上并且永远不会消失。在上面我调用 stopAnimating() 的地方,指示器实际上都没有停止动画。这特别令人困惑,我在调用它后立即停止它但它仍然存在。

最佳答案

您的代码存在一些问题。最大的一个是您已将 activityIndi​​cator 设为计算属性。每次您引用它时,您的关闭代码都会被执行,您会得到一个新的、前所未见的事件指示器。试试这段代码作为测试:

print(String(format: "activityIndicator address = %X", activityIndicator))
print(String(format: "activityIndicator address = %X", activityIndicator))
print(String(format: "activityIndicator address = %X", activityIndicator))

请注意,您会为每个打印语句获得不同的地址。

这意味着每次您引用 activityIndi​​catorself.activityIndi​​cator 时,您都会创建另一个事件指示器并将其添加到您的 View 层次结构中。这不是你想要的。

相反,让你的变量成为惰性变量:

lazy var activityIndicator: UIActivityIndicatorView = {
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .white)
activityIndicator.hidesWhenStopped = true
activityIndicator.center = CGPoint(x: self.frame.width/2, y: self.frame.height/2)
self.addSubview(activityIndicator)
return activityIndicator
}()

请注意该代码如何进行赋值,以及闭包在 (()) 后有括号。

惰性限定符意味着变量直到第一次被引用时才会被创建,然后只被创建一次。

闭包后面的括号表示闭包像函数一样被调用,变量 activityIndi​​cator 将包含闭包的结果。

您还应该摆脱所有地方的 stopAnimating() 调用,但在 dataTask 中对 DispatchQueue.main.async 的调用完成处理程序。您只想在下载完成后停止动画,并且您必须像从主线程那样进行 UI 调用。额外调用 stopAnimating() 只会给您带来麻烦。

关于ios - swift UIActivityView stopAnimating() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46800767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com