要将 Binding 从 EditView 传递到新 NavigationView 中的 DetailEditView,您可以使用 NavigationLink 的 isDetailLink 参数。当设置为 true 时,NavigationLink 会将其目标视图的绑定作为参数传递给 navigationDestination 视图。
这是一个例子:
struct EditView: View {
@State var text: String
var body: some View {
NavigationLink(
destination: DetailEditView(text: $text),
isDetailLink: true
) {
Text("Edit")
}
}
}
struct DetailEditView: View {
@Binding var text: String
var body: some View {
TextField("Text", text: $text)
}
}
在上面的示例中,EditView 通过 NavigationLink 的 isDetailLink 参数将其 @State 变量文本作为绑定传递给 DetailEditView。然后 DetailEditView 可以使用 @Binding 变量文本,就好像它是一个常规的 @State 变量一样。
也可以使用您在问题中提到的 ObservableObject 方法。为此,您需要创建一个 ObservableObject 类来保存您希望在视图之间共享的状态,并将此类的实例作为 @ObservedObject 属性传递给 EditView 和 DetailEditView。然后,视图可以使用 @ObservedObject 属性来访问共享状态。
这是您如何执行此操作的示例:
class SharedState: ObservableObject {
@Published var text: String
}
struct EditView: View {
@ObservedObject var state: SharedState
var body: some View {
NavigationLink(
destination: DetailEditView(state: state),
isDetailLink: true
) {
Text("Edit")
}
}
}
struct DetailEditView: View {
@ObservedObject var state: SharedState
var body: some View {
TextField("Text", text: $state.text)
}
}
在上面的示例中,SharedState 类包含在 EditView 和 DetailEditView 之间共享的文本属性。视图使用 @ObservedObject 属性 state 来访问共享状态,并且可以使用常规 Swift 代码修改共享文本属性。
这两种方法各有优缺点,因此您应该选择最适合您的需求和用例的一种。