Home > front end >  How to pass data from a modal view list to parent view in SwiftUI?
How to pass data from a modal view list to parent view in SwiftUI?

Time:04-13

I have (probably) an easy question related to SwiftUI state management.

A have a modal view with a simple list of buttons:

struct ExerciseList: View {
    var body: some View {
        List {
            ForEach(1..<30) { _ in
                Button("yoga") {
                    
                }
            }
        }
    }
}

The parent view is this one:

struct SelectExerciseView: View {
  
    @State private var showingSheet = false
    @State private var exercise = "select exercise"
    
    var body: some View {
        Button(exercise) {
            showingSheet.toggle()
        }
           .sheet(isPresented: $showingSheet){
               ExerciseList()
           }
    }
}

How can I do to pass the selected button text from the list to the parent view ?
I'm thinking that I need a Binding variable inside the modal and use that, but not really sure how in this example.

CodePudding user response:

At its most basic, you need the selected exercise in your parent view (SelectExerciseView) as a state variable. You then pass that in to the child view (the modal) via a binding. Assuming exercise as a string holds the variable you want to change:

.sheet(isPresented: $showingSheet) {
  ExerciseList(exercise: $exercise)
}

Your modal then needs to have a @Binding reference.

struct ExerciseList: View {
  @Binding var exercise: Exercise

  var body: some View {
    List {
      ForEach(1..<30) { _ in
        Button("yoga") {
          exercise = "yoga"                    
        }
      }
    }
  }
}

CodePudding user response:

Im not sure what you're asking...

Are you trying to show a "Detail View" from the modal.

Meaning theres the parent view -> Modal View -> Detail View

In your case it would be the SelectExerciseView -> ExerciseListView -> DetailView which shows the text of the button that was pressed on the previous view (can be any view you want)

If thats what you're trying to do I would use a NavigationLink instead of a button on the modal. The destination of the NavigationLink would be the detail view

  • Related