Comment déboguer «l'échec de la condition préalable» dans Xcode?


9

Je crée une application SwiftUI sur Xcode 11, mais se termine immédiatement chaque fois que je passe à un onglet particulier de l'application.

Le truc, c'est qu'il pointe toujours vers le Application Delegatefichier, ce qui, à mon avis, n'est pas vraiment le problème. Je reçois également cette erreur dans la console precondition failure: invalid input index: 2et c'est tout, plus de détails supplémentaires sur le fichier, le tableau ou la fonction dont cette erreur provient.

entrez la description de l'image ici

Existe-t-il un moyen d'isoler dans Xcode qui cause ce problème?


Imprimer ce qui est affiché dans la console? Il semble qu'il y ait peut-être une erreur d'index hors plage. Vérifiez les baies que vous pourriez avoir sur votre contrôleur de vue de destination. Ou vérifiez simplement que le ViewController vers lequel vous naviguez avec l'onglet est initialisé et dans le tableau tabController.viewControllers.
Alexander

Salut @Alexander, pour l'initialisation, je suis sûr que mes vues sont correctement initialisées. Et oui, je pense aussi que c'est un problème de tableau, mais je ne sais pas quel tableau dans quelle fonction et dans quelle classe, car cette vue et ses sous-vues sont remplies de tableaux. C'est pourquoi je veux savoir comment déboguer correctement. Actuellement, j'essaye de changer beaucoup de choses dans mon code, en espérant que j'aurais trouvé un correctif (même sans le savoir).
gris

Je reçois cela, dans une situation très similaire. Pour moi, l'application se bloque avec la même sortie de console d'erreur et de débogage. Cela semble être un échec de précondition C ++ (donc dans Swift lui-même - donc par le point d'arrêt ne fonctionne pas). Pour moi, cela se produit lorsque vous essayez d'accéder à la taille d'un GeometryProxy.
Daniel Thorpe

Même chose ici - accéder à la taille de GeometryProxy, à copier dans un@Binding
Grimxn

Ça m'arrive. Le prochain appel dans la pile est GeometryProxy.size.getter () mais il ne se produit pour moi que si j'accède aux onglets SwiftUI dans un certain ordre. GeometryReader n'est utilisé que dans l'onglet à l'origine du blocage (le blocage se produit uniquement si cet onglet est accessible en troisième).
tarasis

Réponses:


10

J'avais une TabView contenant une vue qui utilisait une liste. Lors du changement d'onglet, mon application se bloquait avec une erreur similaire: "échec de la condition préalable: l'attribut n'a pas pu définir une valeur initiale: 99".

var body: some View {
    TabView {
        ListView()
        .tabItem {
            Image(systemName: "list.dash")
            Text("List")
        }

Envelopper le ListView dans un NavigationView a corrigé le plantage. J'ai vu cette utilisation de NavigationView sur "Swift Live - 007 SwiftUI TabView && List" par Caleb Wells . https://youtu.be/v1A1H1cQowI

https://github.com/calebrwells/A-Swiftly-Tilting-Planet/tree/master/2019/Live%20Streams/TabView%20List

Cela a fonctionné:

var body: some View {
    TabView {
        NavigationView { ListView() }
        .tabItem {
            Image(systemName: "list.dash")
            Text("List")
        }

J'ai eu la même erreur avec l' Formintérieur d'un TabViewqui était déjà à l'intérieur d'un NavigationView. Pour contourner l'accident, j'ai dû envelopper le Formdans un autre mannequin NavigationViewet le cacher hors écran avec .padding(.top, -60). 🤷‍♂️
Palimondo

1
cela fonctionne, mais ce n'est pas idéal. Je ne veux pas de vue de navigation.
Imthath

Ma vue personnalisée avait déjà une liste dans la NavigationView. Ce que j'ai fait, c'est que j'ai supprimé le NavigationView de mon affichage personnalisé et l'ai ajouté comme vous l'avez spécifié ci-dessus. Après ce changement, le crash a disparu.
Stefan Vasiljevic

@Palimondo Je pense que ce devrait être -100 et non -60. merci pour le correctif
PaFi

@Imthath je suis d'accord avec vous
Cagatay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.