如何解决SwiftUI-如何使用文本字段和.onchange更新结构中的项目
我有以下代码
struct ContentView: View {
@ObservedObject var list = ModelList.shared
var body: some View {
NavigationView {
List(list.sorted()) {object in
NavigationLink(destination: ModelView(object: object)) {
Text(object.title)
}
}
}
}
}
struct ModelView: View {
@State var object: ModelObject
var body: some View {
VStack {
Text(object.title)
TextField("Label",text: self.$object.text) // xxxxx Error on this line
.onChange(of: self.$object.text) { newValue in
print("Text changed to \(self.$object.text)!")
}
Button("Use") {
self.object.updateDate = Date()
print("title: \(object.title) - text: \(object.text) - date: \(object.updateDate)")
ModelList.shared.objectWillChange.send()
}
}
}
}
class ModelObject: ObservableObject {
@Published var updateDate: Date = Date()
let title: String
var text: String
init(title: String) {
self.title = title
self.text = ""
print(self)
}
}
我确实收到了错误-实例方法'onChange(of:perform :)'要求'Binding'符合XXXXX行上的'Equatable'
但是,如果我在更改行上删除了文本字段,则它会编译并使代码正常工作。但是我想在更改Textfield并将数据保存在数组的结构中时采取一些措施吗?
我在这里想念什么? 谢谢。
解决方法
.onChange(of:perform:)
不需要绑定。只需传递值即可。 print
语句中也是如此:
TextField("Label",text: self.$object.text)
.onChange(of: self.object.text) { newValue in // removed $
print("Text changed to \(self.object.text)!") // removed $
}
这是一个最小的可测试示例,可以演示该问题:
struct ContentView: View {
@State private var string = "hello"
var body: some View {
TextField("Label",text: self.$string)
.onChange(of: self.$string) { newValue in // remove $ here
print("Text changed to \(self.$string)") // remove $ here
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。