18
votes

Comment déboguer "l'échec de préconditionnement" dans Xcode?

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

Le fait est qu'il pointe toujours vers le fichier Application Delegate , ce qui, à mon avis, n'est pas vraiment le problème. J'obtiens également cette erreur dans l' precondition failure: invalid input index: 2 la console precondition failure: invalid input index: 2 et 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 dans Xcode d'isoler ce qui cause ce problème?


6 commentaires

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 pouvez 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.


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 avoir trouvé un correctif (même sans le savoir).


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


Idem ici - accéder à la taille de GeometryProxy, pour copier dans un @Binding


Cela m'arrive. Le prochain appel dans la pile est GeometryProxy.size.getter () mais cela 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 qui provoque le plantage, (le blocage se produit uniquement si cet onglet est accédé en troisième).


Quelqu'un a-t-il trouvé une solution au crash de GeometryProxy.size ? Semble se produire si la vue est derrière une autre vue.


5 Réponses :


20
votes

J'avais un 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 {
        NavigationView { ListView() }
        .tabItem {
            Image(systemName: "list.dash")
            Text("List")
        }

L'emballage du 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 {
        ListView()
        .tabItem {
            Image(systemName: "list.dash")
            Text("List")
        }


5 commentaires

J'ai eu la même erreur avec Form dans un TabView qui était déjà dans un NavigationView . Pour contourner le crash, j'ai dû envelopper le Form dans un autre NavigationView factice et le masquer hors écran avec .padding(.top, -60) . 🤷‍♂️


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


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


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


@Imthath je suis d'accord avec toi



7
votes

J'ai rencontré cela aussi. Je veux juste le partager au cas où quelqu'un le trouverait utile.

RÉPONSE COURTE

Emballer ma vue dans un NavigationView soulèverait l'erreur. L'utilisation de .navigationViewStyle(StackNavigationViewStyle()) résolu mon problème.

LONGUE RÉPONSE

J'avais quelque chose comme ça:

NavigationView {
    GeometryReader { proxy in
        VStack {
            Text("Dummy")
            Spacer()            
            MyView()    // CONTAINS HAS A GEOMETRY READER TOO
                .frame(width: min(proxy.size.width, proxy.size.height),
                       height: min(proxy.size.width, proxy.size.height)) 
            Spacer()
            Text("Dummy")
        }
    }
}

Et puis, MyView avait également un GeometryReader intérieur. Le code tel que décrit échouerait. Si NavigationView était supprimé, l'échec de la condition préalable ne se produirait pas.

J'ai utilisé .navigationViewStyle(StackNavigationViewStyle()) sur NavigationView et cela a résolu mon problème.


1 commentaires

Ouais, NavigationView était également le problème dans mon cas



0
votes

J'ai eu cette erreur d'exécution sur les simulateurs. Dans mon cas, le problème était NavigationBarItems , je l'ai utilisé dans un mauvais bloc comme ci-dessous:

NavigationView {
        Group {
            if something {
            
            ScrollView {
                ...
            }//ScrollView
            .navigationBarItems(trailing: self.favoriteItem) // NO CRASH**
            
        } else {
            ...
        }
        
    }//group
}

J'ai déplacé le modificateur NavigationBarItems et l' ScrollView donné à ScrollView :

NavigationView {
    Group {
        if something {
            
            ScrollView {
                ...
            }//ScrollView
            
        } else {
            ...
        }
        
    }//group
        .navigationBarItems(trailing: self.favoriteItem) // CRASH**
}


0 commentaires

0
votes

Je crois qu'un bogue a été déposé auprès d'Apple https://developer.apple.com/forums/thread/133958 qui concerne les plantages de GeometryReader dans mon cas, j'obtiens un problème similaire avec un tabBar et le message "échec de la condition préalable: index d'entrée invalide : 2 "lorsque vous essayez d'utiliser GeometryReader comme let w = geo.size.width

J'ai essayé d'utiliser une déclaration de garde autour de ça ... ça n'a pas fonctionné - peut-être que je ne fais pas du bruit GUARD.


2 commentaires

Cela ne répond pas vraiment à la question. Si vous avez une autre question, vous pouvez la poser en cliquant sur Poser une question: stackoverflow.com/questions/ask . Vous pouvez également ajouter une prime pour attirer davantage l'attention sur cette question une fois que vous avez suffisamment de réputation: stackoverflow.com/help/privileges/set-bounties


vous avez raison borchvm - mais les humains apprécient la validation et les informations supplémentaires - tous deux inclus dans ma réponse.



0
votes

Dans mon cas, j'ai utilisé un TabView qui était déjà à l'intérieur d'un NavigationView. Dans mon 4ème onglet, j'ai utilisé un espace de noms pour l'animation et après avoir ajouté une animation d'espace de noms, il plantait. J'ai essayé de supprimer GeometryReader de TabView, cela a fonctionné mais a eu d'autres conséquences. J'ai ajouté NavigationView supplémentaire dans le 4ème onglet, cela a également fonctionné mais a également eu d'autres conséquences. Mais l'approche la plus appropriée pour moi était de supprimer un Spacer () dans le 4ème tav. À l'intérieur de cette vue où j'ai ajouté une animation d'espace de noms, il y avait un Spacer () dans le bouton qui poussait toute la vue vers le haut, j'ai supprimé cela et tout va bien maintenant.


0 commentaires