web-dev-qa-db-fra.com

SwiftUI NavigationButton sans l'indicateur de divulgation?

Lorsque vous créez une liste avec une ligne qui pousse vers une nouvelle vue, SwiftUI ajoute automatiquement un indicateur de divulgation ">"? Comment puis-je le supprimer si je ne le veux pas?

    NavigationView {
        List {
            NavigationButton(destination: DetailView()) {
                ListItem()
            }
        }
        .navigationBarTitle(Text("Some title"))
    }

Sur UITableViewCell, vous définissez Accessory sur None, mais comment dois-je procéder dans SwiftUI?

35
Radde Mojsovski

Le plus simple. Le contenu de chaque élément de la liste.

ZStack {
   NavigationLink(destination: DetailView()) {
       EmptyView()
   }.hidden()
   RowView()
}
1
Imthath

Vous n'avez pas besoin d'utiliser NavigationLink pour envelopper directement votre Label. Cela fonctionnera tant que le lien se trouvera n'importe où dans votre hiérarchie de vues.

Ici, je l'ai enveloppé dans un bouton, ce qui vous permet de déclencher une action avant de pousser la vue. Étant donné que NavigationLink a un EmptyView pour l'étiquette, l'indicateur de divulgation n'est pas visible. Vous pouvez également le styliser avec ButtonStyle.

struct NavigationButton<Destination: View, Label: View>: View {
    var action: () -> Void = { }
    var destination: () -> Destination
    var label: () -> Label

    @State private var isActive: Bool = false

    var body: some View {
        Button(action: {
            self.action()
            self.isActive.toggle()
        }) {
            self.label()
              .background(NavigationLink(destination: self.destination(), isActive: self.$isActive) {
                  EmptyView() 
               })
        }
    }
}

Et pour l'utiliser:

NavigationButton(
    action: { print("tapped!") },
    destination: { Text("Pushed View") },
    label: { Text("Tap me") }
  )
1
arsenius

Lorsque vous utilisez List (), il n'y a aucun moyen de supprimer l'indicateur de divulgation sans solution de contournement. Cependant, il existe un autre moyen simple de faire ce que vous voulez faire, sans List (). Au lieu d'un List (), vous pouvez utiliser un ScrollView () qui contient un ForEach ().

Ce n'est ni plus difficile ni plus long, mais cela fait disparaître les indicateurs de divulgation d'un NavigationLink sans astuce ni solution de contournement, sans frais supplémentaires! vous permettant de naviguer facilement vers une autre vue avec un joli bouton normal.

0
Maba bm

Fonctionne bien pour moi!

import SwiftUI

struct LandmarkList: View {
    var body: some View {
        NavigationView {
            List(landmarkData) { landmark in
                LandmarkRow(landmark: landmark)
                NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                    EmptyView()
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["iPhone SE", "iPhone 11 Pro Max"], id: \.self) { deviceName in
            LandmarkList()
                .previewDevice(PreviewDevice(rawValue: deviceName))
                .previewDisplayName(deviceName)
        }
    }
}

enter image description here

0
Politta