SwiftUI中PresentationMode触发变量未初始化错误的原因及解决办法

错误原因
当你为SwiftUI的View自定义实现构造方法时,所有使用属性包装器修饰的存储属性,都需要手动初始化其底层存储值(即带下划线前缀的对应变量)。
你原有写法中直接对viewName、fieldName赋值,本质是访问属性包装器的wrappedValue,这要求self已经完成全部属性的初始化。新增@Environment修饰的presentationMode后,该属性没有被手动初始化,编译器判定self未完成初始化,此时访问viewName等成员就触发了「变量在初始化前被使用」的报错。未加presentationMode时编译器可以自动完成剩余属性的合成初始化,所以没有报错。
修复方案
修改自定义构造方法,手动初始化所有属性包装器的底层存储值即可,修改后的init代码如下:
init(title: String, field: String, value: Binding<Int>, list: [Int]) { // 手动初始化@Environment属性 _presentationMode = Environment(\.presentationMode) // 手动初始化@State属性,不要直接赋值给包装后的变量 _viewName = State(initialValue: title) _fieldName = State(initialValue: field) // Binding属性原有初始化逻辑保持不变 _fieldValue = value options = list }
如果你的项目适配iOS 15及以上系统,还可以使用更简洁的 dismiss 环境变量替代presentationMode,代码修改点如下:
- 替换属性声明:
@Environment(\.dismiss) private var dismiss
- 对应修改init中的初始化代码:
_dismiss = Environment(\.dismiss)
- 关闭视图时直接调用:
dismiss()
内容的提问来源于stack exchange,提问作者teynon
相关产品推荐
相关产品推荐

