我正在寻找SwiftUI中数据存储区的示例,并找到了这个示例。
import SwiftUI
import Combine
class MyDatabase: ObservableObject {
let didChange = PassthroughSubject<MyDatabase, Never>()
var contacts: [Contact] = [
Contact(id: 1, name: "Anna"), Contact(id: 2, name: "Beto"),
Contact(id: 3, name: "Jack"), Contact(id: 4, name: "Sam")
] {
didSet {
didChange.send(self)
}
}
struct Contact: Identifiable{
var id: Int
var name: String
}
}
struct ContactsList: View {
@EnvironmentObject private var database: MyDatabase
var body: some View {
NavigationView {
List($database.contacts) { contact in
NavigationLink(destination: ContactDetail(contact: contact)) {
Text(verbatim: contact.value.name)
//here Error 1: Types of expression....
}
}
.navigationBarTitle(Text("Contacts"))
}
}
}
struct ContactDetail: View {
@Binding var contact: MyDatabase.Contact
var body: some View {
VStack {
TextField($contact[\.name])
.textFieldStyle(.roundedBorder)
.font(.title)
.padding()
//here Error 2: Types of expression....
Spacer()
}
.navigationBarTitle(Text("Edit"), displayMode: .inline)
}
}
但是,在测试之后,我多次遇到以下错误:
表达式类型不明确,没有更多上下文
我还尝试了针对相同解决方案https://mecid.github.io/2019/07/03/managing-data-flow-in-swiftui/的以下教程 但是我遇到了同样的错误。 最新的Beta中的绑定是否发生了任何变化? 我正在运行Beta 6
答案 0 :(得分:1)
似乎您像ObservableObject
一样使用BindableObject
。 BindableObject
从beta 4(?)替换。
BindableObject被ObservableObject协议从 合并框架。
didChange
改用objectWillChange
,应在willChange
观察员内部召唤他。
为避免重复您自己,@Published
属性会为您合成willChange
。
您可以通过定义在对象更改之前发出的objectWillChange发布者来手动遵守ObservableObject。但是,默认情况下,ObservableObject自动合成objectWillChange并在任何@Published属性更改之前发出。
class User: ObservableObject {
@Published var name: String = ""
@Published var email: String = ""
}
如果要绑定@ObservedObject
,请使用ObservableObject
:
struct MyView: View {
@ObservedObject var user: User = User()
var body: some View {
TextField("Name", text: $user.name)
}
}
如果由于使用@EnvironmentObject
而继续遇到问题,请尝试查看:Change to @Published var in @EnvironmentObject not reflected immediately