SwiftUI闭包更新状态触发警告:视图更新期间修改状态将导致未定义行为
问题原因
出现这个警告的核心原因是,你的闭包执行时机刚好落在了SwiftUI的视图更新周期里——哪怕你是通过用户点击取消全选触发的回调,UIKit视图控制器的某些回调流程可能和SwiftUI的视图刷新流程重叠,导致修改@Binding状态时被SwiftUI检测到是在视图更新期间进行的,从而抛出这个警告。
解决方法
方法一:将状态修改延迟到下一个主循环
最直接的修复方式是用DispatchQueue.main.async把状态修改的操作放到当前运行循环之后执行,避开SwiftUI的视图更新周期:
exampleViewController.onDeselectAll = { DispatchQueue.main.async { isInSelectionMode = false } }
方法二:使用Task.main(iOS 15+)
如果你的项目支持iOS 15及以上,也可以用更符合Swift并发风格的Task.main来实现同样的效果:
exampleViewController.onDeselectAll = { Task { @MainActor in isInSelectionMode = false } }
额外说明
如果你的ExampleViewController的onDeselectAll回调是在UIKit的视图生命周期方法(比如viewDidLayoutSubviews)里触发的,那更大概率会和SwiftUI的更新周期冲突,这时候上面的延迟方法就能彻底解决问题。
内容的提问来源于stack exchange,提问作者re_zacks
相关产品推荐
相关产品推荐

