【问题标题】:ForEach NavigationLink with State and BindingForEach NavigationLink 与状态和绑定
【发布时间】: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

标签: ios swift binding swiftui property-wrapper


【解决方案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 中传递值。

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2019-06-17
      • 1970-01-01
      • 2013-06-08
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多