SwiftUI:在视图之间传递ObservableObject时,表达式类型不明确,没有更多上下文

时间:2019-08-23 19:38:33

标签: ios swiftui combine

我正在寻找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

1 个答案:

答案 0 :(得分:1)

似乎您像ObservableObject一样使用BindableObjectBindableObject从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