web-dev-qa-db-fra.com

swiftUI PresentaionLink ne fonctionne pas une deuxième fois

J'ai un ContentView écrit en swiftUI aussi simple que ci-dessous. '' 'corps var: certains Voir {

    NavigationView {
        List {
            Section {
                PresentationLink(destination: Text("new Profile")) {
                    Text("new Profile")
                }
            }
        }
    }

'' '

tout va bien la première fois que je tape sur un nouveau profil mais quand je ferme le modal et réessaye de taper, ça ne marche pas. Est-ce un bug ou une fonctionnalité?

8
Arash

PresentationLink a été déconseillé dans Xcode 11 beta 4 en faveur de .sheet, ce qui semble résoudre le problème.

Ajout de modificateurs de présentation améliorés: feuille (isPresented: onDismiss: content :), actionSheet (isPresented: content :) et alert (isPresented: content :) - avec isPresented dans l'environnement - remplacez la présentation existante (_ :), Sheet, Types Modal et PresentationLink. (52075730)

Si vous changez le code en .sheet comme ci-dessous:

import SwiftUI

struct Testing : View {
    @State var isPresented = false

    var body: some View {
        NavigationView {
            List {
                Button(action: { self.isPresented.toggle() })
                    { Text("Source View") }
                }
            }.sheet(isPresented: $isPresented, content: { Text("Destination View") })
    }
}

Vous pourrez alors utiliser le modal autant de fois que vous le souhaitez au lieu d'une seule fois.

GIF showing that the modal can be brought up and dismissed several times instead of just once

EDIT: Après avoir implémenté cela dans un scénario réel, j'ai constaté que le bogue sous-jacent semble toujours exister si vous mettez .sheet à l'intérieur du List. Si vous suivez l'exemple de code ci-dessus, vous ne rencontrerez pas ce problème mais dans un scénario réel où vous utilisez un List, vous voudrez probablement que des informations sur l'élément particulier qui a été sélectionné soient transmises au modal. Dans ce cas, vous devrez transmettre des informations sur la sélection via un @State var ou un autre moyen. Voici un exemple:

import SwiftUI

struct Testing : View {
    @State var isPresented = false
    @State var whichPresented = -1

    var body: some View {
        NavigationView {
            List {
                ForEach(0 ..< 10) { i in
                    Button(action: {
                            self.whichPresented = i
                            self.isPresented.toggle()
                })
                        { Text("Button \(i)") }
                    }
                }
            }.sheet(isPresented: $isPresented, content: { Text("Destination View \(self.whichPresented)") })
    }
}
13
Zain