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.
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()
}
}
}
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