Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SwiftUI双向绑定到enum案例内ObserveObject内的值_Ios_Swift_Binding_Swiftui_Combine - Fatal编程技术网

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
中,但不管怎样,这都可以正常工作。谢谢!