Ios SwiftUI双向绑定到enum案例内ObserveObject内的值
我试图观察Ios SwiftUI双向绑定到enum案例内ObserveObject内的值,ios,swift,binding,swiftui,combine,Ios,Swift,Binding,Swiftui,Combine,我试图观察observateObject中包含的bool值的变化,该值是enum案例中的值。下面是我试图实现的一个示例,但使用当前方法,我收到了错误使用未解析标识符“$type1Value” import SwiftUI import Combine class ObservableType1: ObservableObject { @Published var isChecked: Bool = false } enum CustomEnum { case option1(
observateObject
中包含的bool
值的变化,该值是enum
案例中的值。下面是我试图实现的一个示例,但使用当前方法,我收到了错误使用未解析标识符“$type1Value”
import SwiftUI
import Combine
class ObservableType1: ObservableObject {
@Published var isChecked: Bool = false
}
enum CustomEnum {
case option1(ObservableType1)
}
struct Parent: View {
var myCustomEnum: CustomEnum
var body: AnyView {
switch myCustomEnum {
case .option1(let type1Value):
AnyView(Child(isChecked: $type1Value.isChecked)) // <- error here
}
}
}
struct Child: View {
@Binding var isChecked: Bool
var body: AnyView {
AnyView(
Image(systemName: isChecked ? "checkmark.square" : "square")
.onTapGesture {
self.isChecked = !self.isChecked
})
}
}
导入快捷界面
进口联合收割机
类ObservableType1:ObservableObject{
@已发布变量已检查:Bool=false
}
枚举自定义枚举{
案例选项1(可观察PE1)
}
结构父级:视图{
var myCustomEnum:CustomEnum
变量主体:AnyView{
切换myCustomEnum{
案例选项1(让类型1取值):
AnyView(子项(isChecked:$type1Value.isChecked))//这可能适用于您的案例:
import SwiftUI
class ObservableType1: ObservableObject {
@Published var isChecked: Bool = false
}
enum CustomEnum {
case option1(ObservableType1)
}
struct Parent: View {
var myCustomEnum: CustomEnum
var body: AnyView {
switch (myCustomEnum) {
case .option1:
return AnyView(Child())
default: return AnyView(Child())
}
}
}
struct Child: View {
@ObservedObject var type1 = ObservableType1()
var body: AnyView {
AnyView(
Image(systemName: self.type1.isChecked ? "checkmark.square" : "square")
.onTapGesture {
self.type1.isChecked.toggle()
})
}
}
好吧,永远不要说永远…我发现了这个场景的有趣解决方案,它甚至允许删除AnyView。使用Xcode 11.4/iOS 13.4测试
提供完整的可测试模块,以防万一
// just for test
struct Parent_Previews: PreviewProvider {
static var previews: some View {
Parent(myCustomEnum: .option1(ObservableType1()))
}
}
// no changes
class ObservableType1: ObservableObject {
@Published var isChecked: Bool = false
}
// no changes
enum CustomEnum {
case option1(ObservableType1)
}
struct Parent: View {
var myCustomEnum: CustomEnum
var body: some View {
self.processCases() // function to make switch work
}
private func processCases() -> some View {
switch myCustomEnum {
case .option1(let type1Value):
// main part !!
return ObservedHolder(value: type1Value) { object in
Child(isChecked: object.isChecked)
}
}
}
}
// just remove AnyView
struct Child: View {
@Binding var isChecked: Bool
var body: some View {
Image(systemName: isChecked ? "checkmark.square" : "square")
.onTapGesture {
self.isChecked = !self.isChecked
}
}
}
这里有一个组织核心
struct ObservedHolder<T: ObservableObject, Content: View>: View {
@ObservedObject var value: T
var content: (ObservedObject<T>.Wrapper) -> Content
var body: some View {
content(_value.projectedValue)
}
}
struct ObservedHolder:视图{
@观察到的对象变量值:T
var-content:(ObservedObject.Wrapper)->content
var body:一些观点{
内容(_value.projectedValue)
}
}
问题在于,对于声明为@ObservedObject
的变量,您只能获得$obj.prop
语法——不在observeObject
上。这确实有效,但如果您有第二种类型,如。option2(让type2Value)
的值为Child2
返回类型仍然需要包装在AnyView
中,但不管怎样,这都可以正常工作。谢谢!