姬長信(Redy) 大佬早!

源码

首页 » 归档 » 源码 » swiftui:在视图之间传递ObservableObject时,表达式类型不明确

swiftui:在视图之间传递ObservableObject时,表达式类型不明确

我在SwiftUI中寻找一个DataStore的例子并找到了这个例子。

import SwiftUI
import Combine

class MyDatabase: ObservableObject {
    let didChange = PassthroughSubject()

    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)
    }
}

但是/uff0c在测试之后/uff0c我多次得到以下错误/uff1a
如果没有更多的上下文/uff0c表达的类型是不明确的
我也尝试了相同的解决方案https://mecid.github.io/2019/07/03/managing-data-flow-in-swiftui/的教程/uff0c但我得到了同样的错误。 关于最新测试版中的Bindings有什么变化吗/uff1f 我正在运行Beta 6

-----------------------------------------------------------------------------------------------------------------------------------------------------

提问人似乎正在使用像BindableObject这样的ObservableObject。 BindableObject被替换为beta 4/uff08/uff1f/uff09。
BindableObject由Combine框架中的ObservableObject协议替换。
didChange更改为objectWillChange/uff0c他应该在willChange观察者中调用。
为避免重复/uff0c@ Preubin属性为提问人合成了willChange。
可以通过定义在对象更改之前发出的objectWillChange发布者来手动符合ObservableObject。 但是/uff0c默认情况下/uff0cObservableObject会自动合成objectWillChange并在任何@Published属性更改之前发出。

class User: ObservableObject {

    @Published var name: String = ""
    @Published var email: String = ""

}

如果要绑定ObservableObject/uff0c请使用@ObservedObject/uff1a

struct MyView: View {

    @ObservedObject var user: User = User()

    var body: some View {
        TextField("Name", text: $user.name)
    }

}

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/swiftuizaishituzhijianchuandiobservableobjectshibiaodashileixingbumingque.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:8 月 25, 2019 at 07:29 下午

热评文章