首页 > 解决方案 > 如何在 IBAction 中的所有代码完成之前更改 UIButton 的标题?

问题描述

我创建了一个从在线数据库重新加载数据的按钮。我希望 UIButton 标题在按下按钮时立即从“重置数据”更改为“重置挂起...”;发生数据重新加载代码,并且UIButton在数据重新加载完成触发时标题更改为“重置完成”。

在返回所有内容之前,我无法更改按钮标题@IBAction func,并且非常感谢您指出正确的方向。

如果我按预期从标题更改中删除该resetAllDataFromOnline()@IBAction,否则我只会在下载完成时完成重置。我也无法更改页面上的单独标签。

@IBAction func resetDataFromOnlineButtonPressed(_ sender: Any) {
    resetDataFromOnlineButton.setTitle("Reset pending...", for: .normal)
    resetAllDataFromOnline()
}

func resetAllDataFromOnline() {
    DispatchQueue.global(qos: .userInteractive).sync {
        NetworkHelperFunctions.updateAnEmptyLocalDatabaseFromOnline(coreDataStack: self.coreDataStack) { (_) in
            let newCurrentUser = LoginHelpFunc.checkForValidUserAndLogoutIfNotValid(coreDataStack: self.coreDataStack)
            if let newCurrentUser = newCurrentUser {
                self.currentUser = newCurrentUser
            }
            DispatchQueue.main.async {
                resetDataFromOnlineButton.setTitle("Reset complete", for: .normal)
            }
        }
    }
}

标签: iosswift

解决方案


第一次sync调用会resetAllDataFromOnline阻止您的操作方法返回。因此它不能返回到运行循环并更新按钮的视图。你应该尝试async打电话。您还应该在后台调用更新操作以允许视图的并发更新:

func resetAllDataFromOnline() {
    DispatchQueue.global(qos: .background).async {
        ...
    }
}

推荐阅读