web-dev-qa-db-fra.com

Impossible d'instancier la classe nommée IBNSLayoutConstraint

J'utilise XCode6 beta et j'essaie Swift. Lorsque je mets des contraintes de disposition automatique dans un contrôleur de vue, l'application se bloque avec l'erreur suivante: Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

69
zbrox

Vous obtenez cette erreur car vous avez défini une contrainte sur un IBOutlet qui est supprimé au moment de l'exécution. Cela se produit lorsque vous définissez la contrainte comme espace réservé dans Interface Builder. Puisque la contrainte est supprimée, lorsqu'elle va la désarchiver, elle génère une erreur indiquant qu'elle ne peut pas le faire.

Il existe deux façons de corriger cela.

Méthode 1

  1. Faites un clic droit sur votre Storyboard> Ouvrir en tant que> Code source
  2. Dans le storyboard ouvert xml, recherchez placeholder="YES".
  3. Vous trouverez des contraintes qui doivent être supprimées lors de l'exécution. Supprimez l'attribut d'espace réservé de la contrainte, enregistrez et fermez.
  4. Exécutez l'application et votre problème devrait être résolu.

Méthode 2

  1. Recherchez la contrainte à l'origine de vos problèmes dans Interface Builder. Décochez l'option Placeholder dans l'interface graphique. Cela devrait être l'une des contraintes définies sur un IBOutlet dans le ViewController à l'origine de votre blocage.

Interface Builder attribute editor showing the Placeholder option checked.

Voici à quoi cela devrait ressembler:

Interface Builder attribute editor showing the Placeholder option unchecked.

Alternative

En supposant que vous vouliez réellement que la contrainte soit un espace réservé, vous devrez supprimer toutes les prises de référence. Pour ce faire, sélectionnez la contrainte que vous souhaitez être un espace réservé. Ouvrez ensuite l'inspecteur de connexions (le bouton le plus à droite qui ressemble à ceci: (->)), puis supprimez toutes les prises de référence pouvant exister sur cette contrainte.

198
Sandy Chapman

J'ai eu le même problème tout à l'heure et ce qui suit a fonctionné pour moi.

J'ai publié une version de travail de mon application sur l'App Store, je suis revenue pour y travailler quelques jours plus tard en appuyant sur l'un de mes onglets dans l'UITabBarController, il s'est écrasé avec l'erreur:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

Je n'avais aucune contrainte de disposition d'espace réservé que je connaissais ou des sorties de contrainte qui n'auraient pas dû être définies.

La solution pour moi était de simplement désactiver les classes de taille et de conserver les données de classe de taille pour iPhone (l'application est uniquement pour iPhone). Cela a dû supprimer tout ce que j'avais manqué dans les classes de taille. Je veux des classes de taille, je les ai donc réactivées et l'application a à nouveau fonctionné.

6
Philip Moore

Ce n'est peut-être pas nécessairement un problème de contrainte. Pour moi, cela est dû au fait que je n'ai pas vérifié "Installé" pour une classe de taille qui s'appliquait à ma mise en page, voir ici install must be checked

4
abinop

Il y a eu un problème avec l'utilisation des classes de taille. J'ai désactivé cette option dans les propriétés du storyboard et n'utilise que la mise en page automatique. Ce n'était pas un gros problème car l'application est uniquement pour iPhone.

1
zbrox

Ce qui m'est finalement arrivé, c'est que j'ai coupé une sous-vue à l'intérieur d'Interface Builder pour la copier dans un autre xib. Cela a laissé la sous-vue dans le générateur d'interface xib d'origine avec elle grisée. Après avoir supprimé la sous-vue de son emplacement d'origine (en sélectionnant et en supprimant). J'ai pu me débarrasser de l'erreur.

1
wilforeal

Il y a une option dans la fenêtre de l'inspecteur lorsque vous sélectionnez le fichier xib qui n'utilisera pas les contraintes sous "Afficher le fichier de l'inspecteur" dans l'inspecteur appelé "Utiliser la mise en page automatique".

0
iPatel

J'ai apporté une modification à une vue de défilement afin qu'elle permette aux commandes du sélecteur intégrées de fonctionner correctement en utilisant une solution que j'ai trouvée ailleurs dans Stackoverflow. Mon nouveau storyboard a simplement ajouté ces attributs à la vue de défilement, ce qui me semblait bien.

     delaysContentTouches="NO" canCancelContentTouches="NO"

Mais en plus, j'ai vu dans mon storyboard dans une autre scène le nouveau fragment suivant:

                    <variation key="default">
                        <mask key="subviews">
                            <exclude reference="86H-aM-wei"/>
                        </mask>
                    </variation>

Je ne sais pas d'où ça vient. Au début, je l'ai ignoré parce que tout semblait fonctionner sur ma machine de développement. Mais lorsque la version a été construite en version Release et testée, j'ai eu le plantage. La suppression de ce fragment parasite (?) A corrigé le crash et n'a semblé avoir aucun impact sur autre chose.

0
Andy Weinstein

J'ai eu ce problème lorsque j'avais un bouton dans une UICollectionViewCell personnalisée et que j'avais certaines de ses contraintes en tant qu'IBOutlets sur cette classe. J'ai déplacé le bouton de la cellule vers le contrôleur de vue parent et les IBOutlets étaient toujours référencés dans la cellule mais n'existaient pas réellement sur la cellule, alors tout a explosé. Juste besoin de supprimer ces IBOutlets et tout a bien fonctionné à nouveau!

0
CMash