En présence de plusieurs boutons et de plusieurs vues de destination, comment faire pour que chaque bouton n'ouvre que sur sa propre vue de destination (et non sur toutes les autres)?

Bonjour, Je fais face à un problème avec le NavigationLink de mon appli : il y a plusieurs boutons de navigation sur ma vue, auxquels j'ai attribués, à chacun, une vue de destination. Mais lorsque je clique sur l'un ou l'autre des boutons, la vue qui m'est renvoyée est aléatoire, et se balade entre toutes les vues de destination, que j'aie pourtant attribuées, une à une, à chaque bouton. Ainsi, en présence de plusieurs boutons et de plusieurs vues de destination, comment faire pour que chaque bouton n'ouvre que sur sa propre vue de destination (et non sur toutes les autres )? J'ai essayé plusieurs méthodes, mais là, je crois bien devoir demander l'aide de la communauté. Merci d'avance ! // // Techniques.swift // Survivre // // Created by LEZIER CHRISTOPHE on 26/08/2022. //

import SwiftUI

struct GrowingButton5: ButtonStyle {

func makeBody(configuration: Configuration) -> some View {
    configuration.label
        .padding()
        .clipShape(Capsule())
        .scaleEffect(configuration.isPressed ? 1.2 : 1)
        .animation(.easeOut(duration:0.2),
                   value : configuration.isPressed)
}

}

struct Accueil: View {

@State var isOn = false



var body: some View {
    
    NavigationView {
    ScrollView {
        VStack {
            Group {
            Text("SURVIVING")
                .font(.largeTitle)
            Text("THE TWENTY-FIRST")
                .font(.title)
            Text("CENTURY")
                .font(.title)
            
                Spacer()
        
            Text("Petite Application de Survie")
                .font(.title3)
            
                VStack {
                    
                    NavigationLink(destination : Main(), isActive : $isOn){EmptyView()}
                
                
            Button(
                action:{
                           
                    if isOn == false {
                        isOn = true
                        }else{
                        isOn = false

                            }
                        },
                        label :{
                    Image("Surviving_Horizontal 5")
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(width: 150, height: 150)
                        .padding(.top)
                        })
                    
                }
                
                
                    Text("A l'usage des Honnêtes Gens")
                        .font(.title3)
                
                VStack {
                    NavigationLink(destination: Presentation(), isActive : $isOn, label: {
            Button(
                action:{
                           
                    if isOn == false {
                        isOn = true
                        }else{
                        isOn = false
                            }
                        },
                        label :{
                    Image("Chapeau")
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(width: 100, height: 90)
                       })
                })
                }
                
                    Text("PRESENTATION")
                        .font(.title3)
            }
            Group {
                Spacer()
                
                VStack {
                    NavigationLink(destination: Reperes(), isActive : $isOn, label: {
                
                Button(
                action:{
                           
                    if isOn == false {
                        isOn = true
                        }else{
                        isOn = false
                            }
                        },
                        label :{
                    Image("Reperes")
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(width: 80, height: 80)
                        .padding(.bottom)
                        })
                })
                }
                
            Text("REPERES")
                .font(.title3)
                Spacer()
                
                VStack {
                    NavigationLink(destination: Ressources(), isActive : $isOn, label: {
                
                Button(
                    action:{
                       
                        if isOn == false {
                            isOn = true
                        }else{
                            isOn = false
                        }
                    },
                    label :{
                Image("Ressources")
                    .resizable()
                    .aspectRatio(contentMode: .fill)
                    .frame(width: 90, height: 60)
                   })
                })
                }
                
                Text("RESSOURCES")
                    .font(.title3)
       
            }
            Group {
                Spacer()
                
                VStack {
                    NavigationLink(destination: Techniques(), isActive : $isOn, label: {
        Button(
            action:{
                       
                if isOn == false {
                    isOn = true
                    }else{
                    isOn = false
                        }
                    },
                    label :{
                Image("Technique")
                    .resizable()
                    .aspectRatio(contentMode: .fill)
                    .frame(width: 90, height: 80)
                   })
                    })
                
                
        Text("TECHNIQUES")
            .font(.title3)
                }
    
    Spacer()
            Spacer()
                
                VStack {
                    NavigationLink(destination: Bonus(), isActive : $isOn, label: {
                
        Button(
            action:{
                       
                if isOn == false {
                    isOn = true
                    }else{
                    isOn = false
                        }
                    },
                    label :{
                Image("Bonus")
                    .resizable()
                    .aspectRatio(contentMode: .fill)
                    .frame(width: 80, height: 70)
                 
                    })
                    })
                    
                Text("BONUS")
                    .font(.title3)
            
                }
    }.frame(width: 300, height: 50, alignment: .center)
    
    
}.buttonStyle(GrowingButton5())
            .buttonStyle(PlainButtonStyle())
}

} } }

struct Accueil_Previews: PreviewProvider { static var previews: some View { Accueil()

        .previewInterfaceOrientation(.portraitUpsideDown)
}

}

Answered by HeatMiners in 726430022

Merci Claude31 pour ton aide Le problème ne venait pas du isOn (que j'ai bien sûr mis dans une fonction, afin d'alléger le script), il s'agissait du NavigationLink qui me renvoyait aléatoirement les vues de destination de plusieurs boutons. J'ai résolu le problème à l'instant en : -créant un enum NavigationItem{ case XXXX case XXY }

  • créant un @State var navigatedItem: NavigationItem? = .XXXX
  • en liant le navigationLink : NavigationLink(destination: XXXX(), tag : NavigationItem.XXXX, selection: $navigatedItem){EmptyView()}

Le tout fonctionne à présent comme souhaité. (Ouf!)

Je ne comprends pas comment tu utilise isOn. C'est le même pour toutes les destinations.

Il faudrait créer un isOn par destination:

@State var isOnMain = false
@State var isOnPresentation = false
@State var isOnReperes = false
// etc

Tu peux aussi simplifier le code en remplaçant:

if !isOn { isOn = true  }

bien sur pour chaque nouvel isOn (isOnMain…)

Accepted Answer

Merci Claude31 pour ton aide Le problème ne venait pas du isOn (que j'ai bien sûr mis dans une fonction, afin d'alléger le script), il s'agissait du NavigationLink qui me renvoyait aléatoirement les vues de destination de plusieurs boutons. J'ai résolu le problème à l'instant en : -créant un enum NavigationItem{ case XXXX case XXY }

  • créant un @State var navigatedItem: NavigationItem? = .XXXX
  • en liant le navigationLink : NavigationLink(destination: XXXX(), tag : NavigationItem.XXXX, selection: $navigatedItem){EmptyView()}

Le tout fonctionne à présent comme souhaité. (Ouf!)

(Quelques heures plus tard) My apologize to Claude31 : après avoir cru en ma solution, et après plusieurs heures de nouvelles tentatives pour débloquer mon NavigationLink qui bloquait toujours, mais sur un nouveau point, j'ai repris votre conseille de ce matin et me le suis appliqué. Votre solution fonctionne parfaitement, tous mes bug ont disparu : un très grand merci à vous ! (Mes excuses pour mon entêtement : en vous écoutant tout de suite, j'aurais gagné une bonne après-midi de travail, je le saurais pour la prochaine fois...) Merci encore Christophe

En présence de plusieurs boutons et de plusieurs vues de destination, comment faire pour que chaque bouton n'ouvre que sur sa propre vue de destination (et non sur toutes les autres)?
 
 
Q