ios - 如何在 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)
}
}
}
}
解决方案
第一次sync
调用会resetAllDataFromOnline
阻止您的操作方法返回。因此它不能返回到运行循环并更新按钮的视图。你应该尝试async
打电话。您还应该在后台调用更新操作以允许视图的并发更新:
func resetAllDataFromOnline() {
DispatchQueue.global(qos: .background).async {
...
}
}
推荐阅读
- reactjs - Redux 状态加载,但反应不渲染
- node.js - 在我的基于 NodeJS 的 lambda 中,无法在回调 getSignedUrl 时调用 AWS SES sendEmail 函数
- hibernate - 使用 AND/OR 组合的休眠条件
- java - 我的快速排序方法有一个基本案例,但我仍然收到堆栈溢出错误?
- node.js - 如何使用 Sequelize 在表(复合键)之间创建关联?
- sql - T-sql,运行名称存储在字符串变量中的函数......使用 exec 之类的东西......并捕获返回值
- php - 使用 natsort() 对函数的返回值进行排序
- computer-science - 每当通过汇编(RISC-V)在字符串中出现双辅音时,如何打印减号(-)?
- python - Python递归函数删除无
- android - 在 Android 模拟器中录制闪烁