web-dev-qa-db-fra.com

Comment présenter la vue en cliquant sur un bouton?

J'essaie de créer une application en utilisant SwiftUI d'Apple et j'ai besoin d'avoir deux boutons qui présentent deux vues différentes sur une seule ligne List.

J'utilise Xcode beta 7 et MacOS Catalina beta 7. J'ai essayé d'ajouter un Button qui présente la vue mais je n'ai pas pu cliquer dessus et quand j'ai essayé un simple Button en dehors du List et que j'ai cliqué dessus, la vue AddList() n'apparaissait pas. J'ai également essayé d'ajouter un navigationButton à l'intérieur navigationButton mais cela n'a pas fonctionné aussi. L'ajout d'un tapAction ne fonctionne pas trop lorsque vous cliquez dessus, la vue n'apparaît toujours pas

NavigationView {
            List(0..<5) { item in
                NavigationLink(destination: ContentOfList()) {
                    Text("hello") // dummy text
                    Spacer()
                    Text("edit")
                        .tapAction {
                            AddList() // This is the view I want to present
                    }
                }
                }.navigationBarItems(trailing: NavigationLink(destination: AddList(), label: { // doesn't work within navigationBarItems
                    Image(systemName: "plus.circle.fill")
                }))
        }

Je m'attends à ce que la vue AddList() apparaisse, mais dans les deux cas, ce n'est pas le cas.

6
Christophe Prat

Version très améliorée (SwiftUI, iOS 13 beta 7)

La même solution fonctionne pour rejeter les modaux présentés avec le modificateur .sheet.

import SwiftUI

struct DetailView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    var body: some View {
        Button(
            "Here is Detail View. Tap to go back.",
            action: { self.presentationMode.wrappedValue.dismiss() }
        )
    }
}

struct RootView: View {
    var body: some View {
        VStack {
            NavigationLink(destination: DetailView())
            { Text("I am Root. Tap for Detail View.") }
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            RootView()
        }
    }
}
2
Chuck H

version améliorée. (Swift, iOS 13 bêta 4)

class NavigationModel : BindableObject {
    var willChange = PassthroughSubject<Void, Never>()
    var presentedData: String? {
        didSet {
            willChange.send()
        }
    }
    func dismiss() { if presentedData != nil {
        presentedData = nil
    } }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            MasterView()
        }.environmentObject(NavigationModel())
    }
}

struct MasterView: View {

    @EnvironmentObject
    var navigationModel: NavigationModel
    var destinationLink = DynamicNavigationDestinationLink<String, String, DetailView>(id: \.self) { data in DetailView(data: data) }

    var body: some View {
        List(0..<10) { index in
            Button("I am root. Tap for more details of #\(index).") {
                self.navigationModel.presentedData = "#\(index)"
            }
        }
        .navigationBarTitle("Master")
        .onReceive(navigationModel.willChange) {
            self.destinationLink.presentedData?.value = self.navigationModel.presentedData
        }
    }
}

struct DetailView: View {
    @EnvironmentObject
    var model: NavigationModel

    let data: String

    var body: some View {
        Button("Here are details of \(data). Tap to go back.") {
            self.model.dismiss()
        }
        .navigationBarTitle("Detail \(data)")
    }
}

struct Empty : Hashable {
}


#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

0
frogcjn