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<MyEntity>'
EDIT2:目的是将一些对象传递给DetailView,然后再将其传递回ContentView
【问题讨论】:
检查 ForEach 在初始化闭包中提供的条目类型。 MyEntity 类型是否通过其 projectionValue 属性提供了绑定?这就是入口前面的 $ 的含义。 我听不懂。 MyEntity 是一个 CoreData 元素 如果我删除 $ 我得到:无法将类型“MyEntity”的值转换为预期的参数类型“Binding在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<MyEntity> entities
不符合 Binding
或 DynamicProperty
。对于要锻炼的$
符号,必须符合Binding
。
您可以在ObservableObject
中创建FetchedResultsController
以获得与@FetchRequest
相同的功能,并且能够在EnvironmentObject
或ObservedObject
中传递值。
【讨论】:
以上是关于ForEach NavigationLink 与状态和绑定的主要内容,如果未能解决你的问题,请参考以下文章
swiftui foreach Navigationlink 立即弹出
SwiftUI:如果在 ForEach 中使用 NavigationLink 会立即弹出
无法在 List ForEach 中以编程方式激活 NavigationLink
SwiftUI NavigationView 与 List 内 ForEach 中的 NavigationLink 来回跳转