0

In my app, I have multiple buttons that will all call a new view through .sheet. These buttons are in various HStacks, VStacks, and .contextMenus. I want to be able to call a different sheet depending on the button but can't seem to find a way to do it.

The code below is showing a List I have where each row has a context menu linked to it, these buttons inside the context menu are where I want to call some of these sheets from.

Main View Code:

VStack{
    HStack{
        Button(action: {}){
            //Insert Button Text Here
        }
    }
    List{
        ForEach(homeTeam.players){ player in
            HStack{
                Text("\(player.shirtNumber) - \(player.playerName)")
                Spacer()
                Text("\(player.timerText)")
            }
             .foregroundColor(player.active ? Color.black : Color.gray)
             .contextMenu{
                 PlayerContextMenu(team: homeTeam, player: player) //References the buttons below for the context menu
             }
        }
    }
}

Context Menu Code:

struct PlayerContextMenu: View{
    
    @ObservedObject var team: Team
    @ObservedObject var player: Player
    
    var body: some View{
        Button(action: {}) { //I want to open up a specific sheet here
            Text("Edit Name")
            Image(systemName: "square.and.pencil")
        }
    }
}
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
benpomeroy9
  • 375
  • 5
  • 21

1 Answers1

0

I think the solution is to attach the sheets to empty views. Please see example below.

.background(EmptyView()
                .sheet(isPresented: $showingFirstSheet, content: {
                    FirstSheetView(isPresented: $showingFirstSheet)
                })
                .background(EmptyView()
                                .sheet(isPresented: $showingSecondSheet) {
                                    SecondSheetView(isPresented: $showingSecondSheet)
                                }
                )
)

In full context.

struct ContentView: View {
    @State private var showingFirstSheet: Bool = false
    @State private var showingSecondSheet: Bool = false

    var body: some View {
        VStack {
            Button(action: {
                showingFirstSheet.toggle()
            }, label: {
                Text("Show first sheet")
            })
            
            Button(action: {
                showingSecondSheet.toggle()
            }, label: {
                Text("Show second sheet")
            })
        }
        .background(EmptyView()
                        .sheet(isPresented: $showingFirstSheet, content: {
                            FirstSheetView(isPresented: $showingFirstSheet)
                        })
                        .background(EmptyView()
                                        .sheet(isPresented: $showingSecondSheet) {
                                            SecondSheetView(isPresented: $showingSecondSheet)
                                        }
                        )
        )
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct FirstSheetView: View {
    
    @Binding var isPresented: Bool
    
    var body: some View {
        Text("First Sheet")
    }
}

struct SecondSheetView: View {
    
    @Binding var isPresented: Bool
    
    var body: some View {
        Text("Second Sheet")
    }
}
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
Will Dale
  • 21
  • 1
  • 6