ForEach NavigationLink 与状态和绑定

Posted

技术标签:

【中文标题】ForEach NavigationLink 与状态和绑定【英文标题】:ForEach NavigationLink with State and Binding 【发布时间】:2020-02-23 10:49:22 【问题描述】:

我正在尝试使用 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&lt;MyEntity&gt;'

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

【问题讨论】:

检查 ForEach 在初始化闭包中提供的条目类型。 MyEntity 类型是否通过其 projectionValue 属性提供了绑定?这就是入口前面的 $ 的含义。 我听不懂。 MyEntity 是一个 CoreData 元素 如果我删除 $ 我得到:无法将类型“MyEntity”的值转换为预期的参数类型“Binding 那是因为您将其定义为 DetailView 的参数。但 MyEntity 不是 Binding。与 $entity 编译器抱怨,因为它不存在。 $ 是 projectionValue 的快捷方式,请参阅属性包装器定义 所以我需要做的,因为我不仅在 DetailView 中需要它,而且我还需要稍后传递给 ContentView 【参考方案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 中更改它,您会更改相同的对象。

【讨论】:

【参考方案2】:

FetchedResults&lt;MyEntity&gt; entities 不符合 BindingDynamicProperty。对于要锻炼的$ 符号,必须符合Binding

您可以在ObservableObject 中创建FetchedResultsController 以获得与@FetchRequest 相同的功能,并且能够在EnvironmentObjectObservedObject 中传递值。

【讨论】:

以上是关于ForEach NavigationLink 与状态和绑定的主要内容,如果未能解决你的问题,请参考以下文章

swiftui foreach Navigationlink 立即弹出

SwiftUI:如果在 ForEach 中使用 NavigationLink 会立即弹出

无法在 List ForEach 中以编程方式激活 NavigationLink

SwiftUI NavigationView 与 List 内 ForEach 中的 NavigationLink 来回跳转

如何将 ContextMenu 与 NavigationLink 一起使用?

如果它不可见,SwiftUI 如何使 NavigationLink 工作?