当 Enum 中的值随 SwiftUI 发生变化时,如何更新视图?

时间:2021-01-30 17:56:49

标签: swiftui

这是我的代码。 运行 MainView 结构,然后单击应该将单词 first 更新为单词 hello 的按钮。 即使日志显示数据已正确更新,它也根本不会更新。因此,当枚举中的值发生变化时,没有办法让视图更新吗?

我让它工作的唯一方法是一个讨厌的黑客。要尝试 hack,只需取消对 3 行注释代码的注释并尝试一下。有没有更好的办法?

我看过这个类似的问题,但也有同样的问题 -> SwiftUI two-way binding to value inside ObservableObject inside enum case

struct MainView: View {
    @State var selectedEnum = AnEnum.anOption(AnObservedObject(string: "first"))
    // @State var update = false
    var body: some View {
        switch selectedEnum {
        case .anOption(var value):
            VStack {
                switch selectedEnum {
                case .anOption(let val):
                    Text(val.string)
                }
                TestView(object: Binding(get: { value }, set: { value = $0 }),
                         callbackToVerifyChange: callback)
            }
            // .id(update)
        }
    }
    
    func callback() {
        switch selectedEnum {
        case .anOption(let value):
            print("Callback function shows --> \(value.string)")
            // update.toggle()
        }
    }
}

class AnObservedObject: ObservableObject {
    @Published var string: String
    init(string: String) {
        self.string = string
    }
}

enum AnEnum {
    case anOption(AnObservedObject)
}

struct TestView: View {
    @Binding var object: AnObservedObject
    let callbackToVerifyChange: ()->Void
    var body: some View {
        Text("Tap here to change the word 'first' to 'hello'")
            .border(Color.black).padding()
            .onTapGesture {
                print("String before tapping --> \(object.string)")
                object.string = "hello"
                print("String after tapping --> \(object.string)")
                callbackToVerifyChange()
            }
    }
}

0 个答案:

没有答案