web-dev-qa-db-fra.com

iOS SwiftUI: afficher ou masquer la vue par programmation

Je n'ai trouvé aucune référence sur les moyens de faire un pop ou un ignorerpar programme de ma vue présentée avec SwiftUI.

Il me semble que la seule façon est d'utiliser l'action de dow de diapositive déjà intégrée pour le modal (et quoi/comment si je veux désactiver cette fonctionnalité?), Et le bouton de retour pour la pile de navigation.

Quelqu'un connaît-il une solution? Savez-vous s'il s'agit d'un bug ou qu'il restera comme ça?

31
Andrea Miotto

J'ai rencontré un problème de compilation en essayant d'appeler value sur la liaison presentationMode. Changer la propriété en wrappedValue a résolu le problème pour moi. Je suppose que value -> wrappedValue est une mise à jour de la langue. Je pense que cette note serait plus appropriée en tant que commentaire sur la réponse de Chuck H mais n'a pas assez de points de représentant pour commenter, j'ai également suggéré cette modification et modifier, mais ma modification a été rejetée comme étant plus appropriée en tant que commentaire ou réponse.

0
gacoler

Alternativement, si vous ne voulez pas le faire par programme à partir d'un bouton, vous pouvez émettre à partir du modèle de vue chaque fois que vous avez besoin de sauter. Abonnez-vous à un @Published qui modifie la valeur chaque fois que l'enregistrement est effectué.

struct ContentView: View {
    @ObservedObject var viewModel: ContentViewModel
    @Environment(\.presentationMode) var presentationMode

    init(viewModel: ContentViewModel) {
        self.viewModel = viewModel
    }

    var body: some View {
        Form {
            TextField("Name", text: $viewModel.name)
                .textContentType(.name)
        }
        .onAppear {
            self.viewModel.cancellable = self.viewModel
                .$saved
                .sink(receiveValue: { saved in
                    guard saved else { return }
                    self.presentationMode.wrappedValue.dismiss()
                }
            )
        }
    }
}

class ContentViewModel: ObservableObject {
    @Published var saved = false // This can store any value.
    @Published var name = ""
    var cancellable: AnyCancellable? // You can use a cancellable set if you have multiple observers.

    func onSave() {
        // Do the save.

        // Emit the new value.
        saved = true
    }
}
0
Dan Bodnar

Le concept de base de SwiftUI est de surveiller le flux de données.

Vous devez utiliser un @State variable et mute la valeur de cette variable pour contrôler le popping et le licenciement.

struct MyView: View {
    @State
    var showsUp = false

    var body: some View {
        Button(action: { self.showsUp.toggle() }) {
            Text("Pop")
        }
        .presentation(
            showsUp ? Modal(
                Button(action: { self.showsUp.toggle() }) {
                    Text("Dismiss")
                }
            ) : nil
        )
    }
}

0
WeZZard