加载屏幕时,我遇到了这个问题,我启动了一个 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()
        }
    }

}

屏幕卡住时的屏幕截图:

ios - 事件指示器动画不起作用-Swift-LMLPHP

编辑:获取数据的功能:
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/

10-14 08:57