具有状态和绑定的ForEach NavigationLink

时间:2020-02-23 10:49:22

标签: ios swift binding swiftui property-wrapper

我正在尝试使用NavigationLink生成ForEach,并使用State和Binding传递一些实体:

struct ContentView: View {
    @Environment(\.managedObjectContext) var moc

    @FetchRequest(
        entity: MyEntity.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \MyEntity.name, ascending: true)
        ]

    ) var entries: FetchedResults<MyEntity>

    var body: some View {
        NavigationView {
            List {
                ForEach(entries, id: \.self) { (entry: MyEntity) in
                    NavigationLink(destination: DetailView(myEntry: $entry)) {
                        Text(entry.name!)
                    }
                }.
            }
        }
    }
}

然后是以下视图:

struct DetailView: View {
    @Binding var myEntry: MyEntity

    var body: some View {
        Text(myEntry.name!)
    }
}

问题是由于出现错误,我无法将值传递给“详细信息”视图:

Use of unresolved identifier '$entry'

这里有什么问题以及如何解决?

如果我只有一个简单的@State,则可以通过绑定传递它,但是我想/需要在ForEach中将其用于FetchedResults

编辑:如果我删除$,我会得到Cannot convert value of type 'MyEntity' to expected argument type 'Binding<MyEntity>'

EDIT2:目的是将一些对象传递给DetailView,然后再将其传递回ContentView

2 个答案:

答案 0 :(得分:1)

ForEach

中使用以下内容
   ForEach(entries, id: \.self) { entry in
        NavigationLink(destination: DetailView(myEntry: entry)) {
            Text(entry.name!)
        }
    }

以及DetailView

中的以下内容
struct DetailView: View {
    var myEntry: MyEntity

    var body: some View {
        Text(myEntry.name!)
    }
}

MyEntity是类,因此您通过引用传递对象,并在DetailView中对其进行更改,您将更改同一对象。

答案 1 :(得分:1)

FetchedResults<MyEntity> entities不符合BindingDynamicProperty。要使$符号要锻炼,必须符合Binding

您可以在FetchedResultsController中创建一个ObservableObject,以获得与@FetchRequest相同的功能,并能够在EnvironmentObject或{{1 }}。