J'utilise SwfitUI dans mon projet et j'ai un NavigationView et une liste. Je clique sur la cellule après avoir ouvert la vue détaillée et cliqué sur le bouton de navigation de retour. Je veux supprimer la vue (c'est struct, dans SwiftUI) après avoir cliqué sur le bouton de navigation retour. Parce que si je clique à nouveau sur la même cellule ou le même bouton, cela n'initialise pas la nouvelle vue, cela montre l'ancienne vue. Je veux rafraîchir cette vue. Comment fais-je?
Mon FirstView Struct est:
struct FirstView: View {
@ObservedObject var viewModel: FirstViewModel
var body: some View {
List(self.viewModel.objects, id: \.id) { object in
ZStack {
DetailViewCell(object: object)
NavigationLink(destination: DetailViewBuilder.make(object)) {
EmptyView()
}.buttonStyle(PlainButtonStyle())
}
}
}
}
Ma structure DetailView est:
struct DetailView: View {
@ObservedObject var viewModel: DetailViewModel
var body: some View {
ZStack(alignment: .top) {
Color.mainBackground.edgesIgnoringSafeArea(.all)
VStack {
ZStack {
Image("Square")
Image(self.viewModel.currentImage)
}
Text(self.viewModel.currentText)
.padding()
.frame(alignment: .center)
.minimumScaleFactor(0.1)
Spacer()
Button(action: {
self.viewModel.pressedPlayOrPauseButton()
}, label: {
Image(self.viewModel.isPlaying ? "Pause" : "Play").foregroundColor(Color("Orange"))
}).padding()
}
}
}
}
Tout d'abord, je vais au détail en cliquant sur une cellule dans FirstView. Puis je reviens avec le bouton retour. Je clique à nouveau sur une cellule pour accéder aux détails, mais une nouvelle vue ne s'ouvre pas. Il montre l'ancienne vue.
Avant que j'oublie, ma classe de constructeur est:
final class DetailViewBuilder {
static func make(object: Something) -> DetailView {
let viewModel = DetailViewModel(object: object)
let view = DetailView(viewModel: viewModel)
return view
}
}
Remarque: si j'utilise Sheet Presented, cela fonctionne. Il crée une nouvelle vue. Mais je veux utiliser NavigationLink. Merci.
Il vous suffit de reporter la création de votre destination dans votre constructeur, et @ViewBuilderc'est un bon instrument pour cela.
Il peut être utilisé le wrapper suivant pour créer une destination réelle uniquement lorsque bodysera rendu (c'est-à-dire explicitement au moment de la navigation cliqué dans votre cas)
Testé avec Xcode 11.4 / iOS 13.4
struct DeferView<Content: View>: View {
let content: () -> Content
init(@ViewBuilder _ content: @escaping () -> Content) {
self.content = content
}
var body: some View {
content() // << everything is created here
}
}
et maintenant votre constructeur
final class DetailViewBuilder {
static func make(object: Something) -> some View {
DeferView {
DetailView(viewModel: DetailViewModel(object: object))
}
}
}
SwiftUI initialise les NavigationViewliens avec impatience, vous ne pouvez donc pas compter sur leur initialiseur pour s'exécuter à chaque fois. Si vous écrivez un init () personnalisé pour DetailView
init(viewModel: DetailViewModel) {
self.viewModel = viewModel
print("Initialising \(self)")
}
vous verrez la ligne imprimée pour chaque lien de navigation lors du chargement de votre FirstView.
Selon ce que vous voulez faire, vous pouvez implémenter une .onAppear {}fermeture sur le DetailView qui changera les données lorsque la vue apparaît. Il est un peu difficile d'essayer de proposer des exemples d'implémentation car je ne suis pas sûr de votre objectif ici.
Il y a une discussion intéressante à ce sujet à: https://www.notion.so/Lazy-Loading-Data-with-SwiftUI-and-Combine-70546ec6aca3481f80d104cd1f10a31a
Certaines des suggestions présentées ici semblent-elles pertinentes par rapport à ce que vous essayez de faire?
Jana Duggar a été ouverte sur sa recherche de l'amour. Voici tout ce qu'elle a dit sur le sujet et sa fenêtre de mariage de cinq ans.
La star d'Outlander, Sam Heughan, a récemment révélé ce qu'il retirera du tournage pour se souvenir de Jamie Fraser, le rôle qui a fait de lui une star.
"She Loves You" a été écrite en une heure, enregistrée en une journée, et a été la chanson des Beatles avec l'une de leurs meilleures performances de leur carrière.
Dolly Parton et sa grand-mère Bessie avaient une relation spéciale. Grand-mère Parton était très malade, mais cela n'a pas empêché Dolly de lui faire des farces.
Vous pensez peut-être que le chêne ou le noyer sont résistants, mais en matière de bois les plus durs au monde, ils sont loin derrière.
L'océan regorge de beauté, mais il abrite aussi certaines des créatures marines les plus terrifiantes de la planète. Nombre de ces animaux vivent dans les profondeurs obscures et sous haute pression des abysses.
Que vous affrontiez des créatures hostiles ou vous prépariez pour des affrontements PvP, connaître les meilleurs enchantements d'épée dans Minecraft peut vous donner un avantage considérable. Enchanter vos épées vous permet d'infliger plus de dégâts, d'augmenter le butin des créatures et d'accroître leur durabilité.
Quand on parle de pays socialistes, on imagine souvent un contrôle total de l'État et l'absence de propriété privée. Mais en réalité, les économies socialistes sont très diverses.
« Enfants » laisse tomber un caméo de grand nom et des nouvelles dévastatrices
Ce RAV4 est déclaré en excellent état et est prêt pour un jeu de chaises musicales.
Des images de drones ont montré des pompiers semblant lutter pour éteindre l'incendie.
Eyes of Wakanda est directement lié au MCU, ainsi que des mises à jour sur X-Men '97, What If..., Daredevil, et plus encore.
Ava Gardner a été mariée à Mickey Rooney et Frank Sintra, et a fréquenté plusieurs autres stars d'Hollywood. Voici un aperçu de l'histoire amoureuse d'Ava Gardner.
John Cleese a épousé sa femme, Jennifer Wade, en 2012. Voici tout ce qu'il faut savoir sur la femme de John Cleese, Jennifer Wade.
Craig Melvin a épousé la présentatrice sportive Lindsay Czarniak en 2011. Voici tout ce qu'il faut savoir sur la femme de Craig Melvin.
Maggie Gyllenhaal et Peter Sarsgaard se sont mariés en 2009 et partagent deux filles ensemble. Voici une chronologie complète de leur relation.
Ça me frappe tout à coup, comme c'est si souvent le cas C'est à nouveau le milieu du chemin <Non, pas celui du Pacifique, toi marron, celui du carnaval> Chaque gros titre fort… ..
En 2022, avec la sortie de GPT-3, la compétence en écriture semble devenir moins importante. Avec l'IA, les personnes ayant une mauvaise écriture peuvent également générer du personnel de qualité.
Dans le monde rapide et compétitif d'aujourd'hui, la carrière d'une personne joue un rôle important dans la croissance personnelle, la stabilité financière et la satisfaction globale de la vie. Cependant, de nombreuses personnes se retrouvent prises dans un cycle incessant de stagnation et d'insatisfaction, dépérissant progressivement dans leur vie professionnelle.
La semaine dernière, j'ai remarqué un communiqué de presse, envoyé via PressGazette (un site Web d'information britannique). L'article annonçait qu'Acast, la société d'hébergement et de publicité de podcasts de Scandi, dirigerait un consortium d'éditeurs "probablement les plus influents" du podcasting.