SwiftUI NavigationView detail view binding to sheet modal not working

I have a List where the navigationLink destination is a view with a binding property for a user struct. works fine, if in the detail view I create another navigationLink to an edit view with a binding property for the user struct, that will update all the views as expected when the user is modified.

My problem is when I don't use the navigationLink from the detail view and use a sheet modal instead. When I update in the sheet, the master a detail views update, but not the sheet, is there something I'm missing?

NavigationView using NavigationLinks works:

MasterView (List of Users)
    | (NavigationLink)
DetailView(user: $user) this binding works
    | (NavigationLink)
EditView(user: $user) this binding works

NavigationView using NavigationLink to detail, and sheet to edit:

MasterView (List of Users)
    | (NavigationLink)
DetailView(user: $user) this binding works
    | (sheet)
EditView(user: $user) this binding doesn't work

My implementation of opening sheets is as follows:

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
}

1 answer

  • answered 2022-05-07 06:30 Dreamystify

    By following @jnpdx suggestion, I was able to solve it with using a different approach to rendering sheets

    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
    }
    

How many English words
do you know?
Test your English vocabulary size, and measure
how many words do you know
Online Test
Powered by Examplum