SwiftUI NavigationView 详细视图绑定到 sheet 模态不起作用
SwiftUI NavigationView detail view binding to sheet modal not working
我有一个列表,其中 navigationLink 目标是一个具有用户结构绑定 属性 的视图。工作正常,如果在详细视图中我创建另一个导航链接到编辑视图,并为用户结构绑定 属性,这将在修改用户时按预期更新所有视图。
我的问题是当我不使用详细视图中的 navigationLink 而是使用 sheet 模式时。当我在 sheet 中更新时,master 更新了详细视图,但在 sheet 中没有更新,是不是我遗漏了什么?
使用 NavigationLinks 的 NavigationView 有效:
MasterView (List of Users)
| (NavigationLink)
DetailView(user: $user) this binding works
| (NavigationLink)
EditView(user: $user) this binding works
NavigationView 使用 NavigationLink 进行详细说明,sheet 进行编辑:
MasterView (List of Users)
| (NavigationLink)
DetailView(user: $user) this binding works
| (sheet)
EditView(user: $user) this binding doesn't work
我打开sheets的实现如下:
struct UserDetailView: View {
@Binding var user: User
@State private var sheetItem: SheetItem?
var body: some View {
VStack {
// content
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
sheetItem = SheetItem(view: AnyView(EditUserView(user: $user)))
}) {
Text("Edit")
}
}
}
.sheet(item: $sheetItem) { view in
showSheet(sheet: view)
}
}
}
struct SheetItem: Identifiable {
var id = UUID()
var view: AnyView
}
func showSheet(sheet: SheetItem) -> some View {
return sheet.view
}
通过遵循@jnpdx 的建议,我能够使用不同的方法来渲染工作表来解决这个问题
struct UserDetailView: View {
@Binding var user: User
@State private var sheetEnum: SheetEnum<SheetType>?
enum SheetType {
case EditUser
}
var body: some View {
VStack {
// content
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
sheetEnum = SheetEnum(type: .EditUser)
}) {
Text("Edit")
}
}
}
.sheet(item: $sheetEnum) { sheet in
if sheet.type == .EditUser {
EditUserView(user: $user)
{
}
}
}
struct SheetEnum<T>: Identifiable {
var id = UUID()
var type: T
}
我有一个列表,其中 navigationLink 目标是一个具有用户结构绑定 属性 的视图。工作正常,如果在详细视图中我创建另一个导航链接到编辑视图,并为用户结构绑定 属性,这将在修改用户时按预期更新所有视图。
我的问题是当我不使用详细视图中的 navigationLink 而是使用 sheet 模式时。当我在 sheet 中更新时,master 更新了详细视图,但在 sheet 中没有更新,是不是我遗漏了什么?
使用 NavigationLinks 的 NavigationView 有效:
MasterView (List of Users)
| (NavigationLink)
DetailView(user: $user) this binding works
| (NavigationLink)
EditView(user: $user) this binding works
NavigationView 使用 NavigationLink 进行详细说明,sheet 进行编辑:
MasterView (List of Users)
| (NavigationLink)
DetailView(user: $user) this binding works
| (sheet)
EditView(user: $user) this binding doesn't work
我打开sheets的实现如下:
struct UserDetailView: View {
@Binding var user: User
@State private var sheetItem: SheetItem?
var body: some View {
VStack {
// content
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
sheetItem = SheetItem(view: AnyView(EditUserView(user: $user)))
}) {
Text("Edit")
}
}
}
.sheet(item: $sheetItem) { view in
showSheet(sheet: view)
}
}
}
struct SheetItem: Identifiable {
var id = UUID()
var view: AnyView
}
func showSheet(sheet: SheetItem) -> some View {
return sheet.view
}
通过遵循@jnpdx 的建议,我能够使用不同的方法来渲染工作表来解决这个问题
struct UserDetailView: View {
@Binding var user: User
@State private var sheetEnum: SheetEnum<SheetType>?
enum SheetType {
case EditUser
}
var body: some View {
VStack {
// content
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: {
sheetEnum = SheetEnum(type: .EditUser)
}) {
Text("Edit")
}
}
}
.sheet(item: $sheetEnum) { sheet in
if sheet.type == .EditUser {
EditUserView(user: $user)
{
}
}
}
struct SheetEnum<T>: Identifiable {
var id = UUID()
var type: T
}