gpt4 book ai didi

ios - SwiftUI 双向绑定(bind)到枚举案例中 ObservableObject 中的值

转载 作者:行者123 更新时间:2023-12-01 15:48:55 33 4
gpt4 key购买 nike

我正在尝试观察 bool 的变化ObservableObject 中包含的值这是 enum 中的值案子。这是我尝试实现的示例,但使用当前方法我收到错误 Use of unresolved identifier '$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
})
}
}

我正在尝试更新 isChecked 的值从界面,但因为我想要 ObservableObject其中包含 enum 中的属性喜欢 CustomEnum不知道该怎么做,或者是否有可能。我选择了一个枚举,因为会有多个不同的枚举选项 ObservableObject值和 Parent将根据 CustomEnum 生成不同的 subview 选项。如果它有任何相关性, Parent将收到 myCustomEnum来自 Array 的值的 CustomEnum值(value)观。这甚至可能吗?如果没有,我有什么选择?谢谢!

最佳答案

好吧,永远不要说永远......我已经为这种情况找到了有趣的解决方案,它甚至允许删除 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)
}
}

关于ios - SwiftUI 双向绑定(bind)到枚举案例中 ObservableObject 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62029382/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com