gpt4 book ai didi

SwiftUI ObservedObject Binding KeyPath 下标错误

转载 作者:行者123 更新时间:2023-11-30 10:36:10 26 4
gpt4 key购买 nike

我在尝试使用泛型类型 T 的 KeyPath 指定 @ObservedObject 的属性绑定(bind)时遇到编译器错误。

我正在尝试创建一个通用的 SwiftUI View ,该 View 适用于具有多个相同类型属性的类。 SwiftUI View 需要是通用的;但是我无法确定如何创建到通过 KeyPath 访问的主对象的属性的绑定(bind)。下面的代码返回错误“‘T’类型的值没有下标”

更新:我在代码中发现了错误,而不是 $model[keyPath: kp] 我应该使用 $model[dynamicMember: kp]。

import SwiftUI

class TestClass: ObservableObject {
@Published public var str1: String = "one"
@Published public var str2: String = "two"
}

struct ContentView: View {

@ObservedObject var test = TestClass()
var body: some View {
VStack {
HStack{
Text("String One").padding(20)
StringView(model: test, kp: \TestClass.str1).padding(20)
}
HStack{
Text("String Two").padding(20)
StringView(model: test, kp: \TestClass.str2).padding(20)
}
}
}
}

struct StringView<T>: View where T: ObservableObject {

@ObservedObject var model: T

var kp: ReferenceWritableKeyPath<T,String>

init(model: T, kp: ReferenceWritableKeyPath<T,String>) {
self.model = model
self.kp = kp
}

var body: some View {
HStack{
TextField("String", text: $model[keyPath: kp]) <--- COMPILER ERROR HERE
Text(model[keyPath: kp])
}
}
}

可以这样做吗?

最佳答案

我认为你可以通过以下方式做到这一点。但我的想法有点冗长。

至少,TextField 需要 Binder。所以KeyPath的目标Type应该是这样的。

class TestClass: ObservableObject {
@Published public var str1: String = "one"
@Published public var str2: String = "two"
}

struct _ContentView: View {

@ObservedObject var test = TestClass()

init() {

}
var body: some View {
VStack {
HStack{
Text("String One").padding(20)
StringView(model: test, kp: \ObservedObject<TestClass>.Wrapper.str1).padding(20)
}
HStack{
Text("String Two").padding(20)
StringView(model: test, kp: \ObservedObject<TestClass>.Wrapper.str2).padding(20)
}
}
}
}

struct StringView<T>: View where T: ObservableObject {

@ObservedObject var model: T

var kp: ReferenceWritableKeyPath<ObservedObject<T>.Wrapper, Binding<String>>

init(model: T, kp: ReferenceWritableKeyPath<ObservedObject<T>.Wrapper, Binding<String>>) {
self.model = model
self.kp = kp
}

var body: some View {
HStack{
TextField("String", text: $model[keyPath: kp])
Text($model[keyPath: kp].wrappedValue)
}
}
}

关于SwiftUI ObservedObject Binding KeyPath 下标错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57984819/

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