1
votes

L'application SwiftUI fonctionne en aperçu mais pas dans le simulateur

Je crée une application pour un projet scolaire où j'essaie de calculer le poids d'une personne sur différentes planètes. Le fichier ContentView fonctionne correctement dans l'aperçu, mais n'affiche que NavigationBar.title dans le simulateur / iPhone. Voici le code

import Foundation
import SwiftUI
struct Planet : Identifiable {
    var id = UUID()
    var name: String
    var g : Float
    var imageName : String { return name }
}

#if DEBUG
let testData = [

    Planet(name: "Mercury", g: 3.724),
    Planet(name: "Venus", g: 8.918),
    Planet(name: "Earth", g: 9.8),
    Planet(name: "Mars", g: 3.724),
    Planet(name: "Jupiter", g: 22.932),
    Planet(name: "Saturn", g: 9.114),
    Planet(name: "Uranus", g: 9.016),
    Planet(name: "Neptune", g: 10.976)

]

#endif


edit- fichier swift appelé Planet

import SwiftUI

struct ContentView : View {
    var planets: [Planet] = []
    var body: some View {
        NavigationView {

            List(planets) { planet in
                PlanetCell(planet: planet)
            }
            .navigationBarTitle(Text("Sun"))

        }
    }
}

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

struct PlanetCell : View {
    let planet : Planet
    var body: some View {
        return NavigationLink(destination: PlanetDetail(planet: planet)){
            Text(planet.name)
        }
    }
}


5 commentaires

voyez-vous une liste SwiftUI vide (vue tableau)? ou pas de vue de la table du tout? pouvez-vous poster une capture d'écran du simulateur?


@ F.Jihad imgur.com/gallery/7MV1EsB


Comme je m'y attendais, votre code est correct et affiche l'interface utilisateur, mais votre tableau de données est vide, c'est pourquoi il ne remplit aucune donnée. Vous avez 0 planète dans votre tableau de planètes


J'ai créé une structure appelée Planet, qui contient des données (qui sont affichées dans l'aperçu). Pouvez-vous montrer comment je peux résoudre ce problème?


vos exemples de données sont enveloppés dans la fermeture #if DEBUG , donc cela ne fonctionnera qu'en aperçu


3 Réponses :


0
votes

Passez-vous une liste non vide ( planètes ) à votre ContentView lorsque vous l'initialisez?


4 commentaires

Je ne sais pas si c'est ce que vous voulez dire ContentView (planets: testData) , si oui, alors j'ai dans le code ci-dessus. Si non, pourriez-vous montrer comment le faire car je suis assez nouveau dans la programmation iOS.


Le code à l'intérieur de ContentView_Previews est utilisé pour l'aperçu Xcode. C'est pourquoi votre aperçu Xcode fonctionne. Cependant, pour le simulateur (ou l'appareil), ce code n'est pas utilisé. Pouvez-vous nous montrer où vous utilisez votre objet ContentView ? Dans le SceneDelegate peut-être?


Attendez, je ne savais pas que nous devions utiliser l'objet ContentView . J'ai appris swiftUI à partir de quelques tutoriels et ils fonctionnent tous sans avoir à écrire du code dans SceneDelegate . J'ai créé un fichier dans lequel les données s'affichent lorsque l'utilisateur clique sur une cellule. Désolé si cette question est stupide - comment créer un objet ContentView .


Je vous encourage à suivre les tutoriels Apple en la matière. Consultez Listes de création et navigation , il devrait répondre à vos besoins.



2
votes

En fait, votre code est correct et fait ce qu'il est censé faire, votre testData est disponible en mode débogage uniquement (aperçu). C'est pourquoi vous ne le voyez pas dans un appareil réel ou un simulateur, afin de voir une donnée réelle, vous devez remplir votre tableau de données planètes dans votre fichier ContentView afin qu'il devrait contenir des planètes tout comme votre testData . Vous devez modifier votre ContentView comme suit:

import SwiftUI

struct ContentView : View {
    var planets: [Planet] = [

        Planet(name: "Mercury", g: 3.724),
        Planet(name: "Venus", g: 8.918),
        Planet(name: "Earth", g: 9.8),
        Planet(name: "Mars", g: 3.724),
        Planet(name: "Jupiter", g: 22.932),
        Planet(name: "Saturn", g: 9.114),
        Planet(name: "Uranus", g: 9.016),
        Planet(name: "Neptune", g: 10.976)

    ]
    var body: some View {
        NavigationView {

            List(planets) { planet in
                PlanetCell(planet: planet)
            }
            .navigationBarTitle(Text("Sun"))

        }
    }
}

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

struct PlanetCell : View {
    let planet : Planet
    var body: some View {
        return NavigationLink(destination: PlanetDetail(planet: planet)){
            Text(planet.name)
        }
    }
}

Je vous recommande de voir comment vous pouvez utiliser ObservableObject et State code > pour lier l'interface utilisateur avec vos modifications de modèle, vous pouvez consulter ce tutoriel: SwiftUI par exemple a >


0 commentaires

1
votes

Dans ContentView, changez

var planets: [Planet] = testData

en

var planets: [Planet] = []


0 commentaires