ios - UIDatePicker setEnabled 只能在主线程中使用
问题描述
在单击“不允许”通知后,我希望某些对象变得未启用和透明。但是,我有一个错误,如下图所示。我怎么解决这个问题?
override func viewDidLoad() {
super.viewDidLoad()
if let savedFirstNotification = savedFirstNotification {
firstDatePicker.date = savedFirstNotification
}
if let savedSecondNotification = savedSecondNotification {
secondDatePicker.date = savedSecondNotification
}
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
if granted {
print("Yep")
} else {
print("No")
self.notEnable()
}
}
}
func notEnable() {
firstDatePicker.isEnabled = false
firstDatePicker.alpha = 0.5
secondDatePicker.alpha = 0.5
secondDatePicker.isEnabled = false
scheludeMeal.alpha = 0.5
scheludeMeal.isEnabled = false
}
解决方案
切换isEnabled
a 的属性UIView
需要在主线程中完成,因为这会修改 UI,而这只能在主线程中进行。您需要notEnable
使用DispatchQueue.main.async
. 的闭包requestAuthorization
似乎是在后台线程上执行的,因此您在尝试从该闭包内部更新 UI 时会看到错误。
center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
if granted {
print("Yep")
} else {
print("No")
DispatchQueue.main.async{
self.notEnable()
}
}
}
推荐阅读
- google-ads-api - 如何获取按关键字拆分的关键字广告系列的 google adwords 效果数据?
- swift - SpriteKit - 没有过滤器的场景缩放模式?
- typescript - 更改订阅中的变量后,Angular 6 View 未更新
- node.js - Node.js 应用程序与 WSO2 身份服务器集成以实现单点登录
- python - 压缩多个嵌套的“for”循环
- laravel - Laravel 5.6 Passport FatalThrowableError on php artisan passport:install --force
- uwp - UWP-如何获取本地机器证书?
- machine-learning - 二元分类中类不平衡的解决方案是什么?
- swift - 快速将非常大的十进制数字转换为十六进制
- java - LoggedErrorException:发现数据绑定错误