加载屏幕时,我遇到了这个问题,我启动了一个 Activity 指示器并调用一个函数来获取数据。最初, Activity 已显示,但从未开始,然后我在不同的线程中运行了每个调用(开始 Activity 并获取数据)。动画有效,但是当我尝试再次加载屏幕时,动画只有一次,直到再次加载数据时,它才被卡住。
这是viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
//indicator
indicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
indicator.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
indicator.color = commons.getButtonColor()
indicator.center = self.view.center
indicator.hidesWhenStopped = true
self.view.addSubview(indicator)
DispatchQueue.main.async {
print("We finished that.")
// only back on the main thread, may you access UI:
self.indicator.startAnimating()
}
//connect to database
commons.ref = Database.database().reference()
//table view
tableV.dataSource = self
tableV.delegate = self
tableV.tableFooterView = UIView()
tableV.separatorStyle = .none
tableV.allowsSelection = false
//change left btn
let leftButtonItem = UIBarButtonItem.init(
title: "",
style: .done,
target: self,
action: #selector(backButtonPressed)
)
leftButtonItem.image = UIImage(named:"back")
leftButtonItem.tintColor = commons.getButtonColor()
self.navigationItem.leftBarButtonItem = leftButtonItem
//style
self.title = flag
DispatchQueue.main.async {
//get values
if(self.flag == "Accounts"){
self.color = "d0f0dd"
self.getAccounts()
}else if(self.flag == "Loans"){
self.color = "f8ff90"
self.getLoans()
}else if(self.flag == "Cards"){
self.color = "ffa669"
self.getCards()
}
}
}
屏幕卡住时的屏幕截图:
编辑:获取数据的功能:
func getAccounts(){
commons.ref.child("Accounts").observeSingleEvent(of: .value, with: { (snapshot) in
for item in snapshot.children {
self.values.append(item as! DataSnapshot)
}
self.tableV.reloadData()
self.indicator.stopAnimating()
}) { (error) in
print(error.localizedDescription)
}
}
func getCards(){
commons.ref.child("Cards").observeSingleEvent(of: .value, with: { (snapshot) in
self.indicator.stopAnimating()
for item in snapshot.children {
self.values.append(item as! DataSnapshot)
}
self.tableV.reloadData()
}) { (error) in
print(error.localizedDescription)
}
}
func getLoans(){
commons.ref.child("Loans").observeSingleEvent(of: .value, with: { (snapshot) in
self.indicator.stopAnimating()
for item in snapshot.children {
self.values.append(item as! DataSnapshot)
}
self.tableV.reloadData()
}) { (error) in
print(error.localizedDescription)
}
}
最佳答案
您的所有3个功能都存在一个常见错误。您并未在代码的所有可能分支上调用stopAnimating
,因此,如果使用error
调用完成处理程序,则 Activity 指示器将继续运行。
我不确定Firebase的完成处理程序是如何实现的,它们可能已经分派到了主队列,但是为了绝对安全,我还建议分派stopAnimating
函数调用到主线程,以确保您不会意外尝试从后台线程更新UI。
func getAccounts(){
commons.ref.child("Accounts").observeSingleEvent(of: .value, with: { (snapshot) in
for item in snapshot.children {
self.values.append(item as! DataSnapshot)
}
DispatchQueue.main.async{
self.tableV.reloadData()
self.indicator.stopAnimating()
}
}) { (error) in
print(error.localizedDescription)
DispatchQueue.main.async{
self.indicator.stopAnimating()
}
}
}
您应该对其他两个功能进行相同的更改。
关于ios - 事件指示器动画不起作用-Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50188332/