web-dev-qa-db-fra.com

Xcode - Comment réparer 'NSUnknownKeyException', motif:… cette classe n’est pas conforme au codage de valeur de clé pour la clé X "?

J'essaie de lier une UILabel à une IBOutlet créée dans ma classe.

Mon application se bloque avec l'erreur suivante.

Qu'est-ce que ça veut dire?

Comment puis-je le réparer?

*** Arrêt de l'application en raison d'une exception non interceptée 'NSUnknownKeyException', raison: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: cette classe n'est pas compatible avec le codage des valeurs de clé pour la clé XXX.'

Merci.

1120
Guillaume Dubois

Votre contrôleur de vue peut avoir la mauvaise classe dans votre xib.

J'ai téléchargé votre projet.

L'erreur que vous obtenez est

'NSUnknownKeyException', raison: '[<<UIViewController 0x3927310> setValue: forUndefinedKey:]: cette classe n'est pas compatible avec le codage de valeur de clé pour la chaîne de clé.'

Cela est dû au fait que le contrôleur de vue Second dans MainWindow.xib a une classe de UIViewController AU LIEU DE SecondView. Le passage à la classe correcte résout le problème.

En passant, il est déconseillé d’avoir des noms tels que "chaîne" dans Objective-C. Il invite une collision de nommage d'exécution. Evitez-les même dans les applications uniques. Nommer les collisions peut être très difficile à repérer et vous ne voulez pas perdre votre temps.

Une autre raison possible de cette erreur: lors du copier-coller d’éléments d’un contrôleur dans un autre, Xcode conserve en quelque sorte ce lien vers le contrôleur d’origine, même après l’édition et la reconnexion de cet élément dans le nouveau contrôleur.

ne autre raison possible de cette erreur:

Mauvais point de vente.

Vous avez soit supprimé ou renommé un nom de prise dans votre .h fichier.

Supprimez-le dans l'inspecteur de connexion du fichier .xib ou .storyboard.

931
TechZen

Vous pouvez avoir une mauvaise connexion dans votre xib.

J'ai eu cette erreur plusieurs fois. Bien que la réponse de TechZen soit tout à fait exacte dans ce cas, une autre cause courante est le fait que vous modifiez le nom d'une propriété IBOutlet dans votre fichier .h/.m. êtes déjà connecté au propriétaire du fichier dans la plume.

De ta plume:

  1. Sélectionnez l'objet dans IB et accédez à l'inspecteur de connexions.
  2. Sous "Référencement des sorties", assurez-vous que votre objet n'est toujours pas connecté à l'ancien nom de la propriété ... s'il l'est, , cliquez sur le petit "x" pour supprimer la référence et construire à nouveau.

    example 1

Une autre cause fréquente si vous utilisez Storyboard, votre UIButton peut avoir plusieurs assignations (la solution est presque la même que pour nib):

  1. Ouvrez votre storyboard et faites un clic droit sur le bouton UIButton.
  2. Vous verrez qu'il y a plus d'une affectation/référence à ce bouton. Supprimez l'une des fenêtres grises "principale ..." avec le petit "x":

    example 2

1487
nuttysimple

Je devais supprimer l'application du simulateur/iPhone pour éliminer cette erreur.

110
Steve Rogers

J'ai eu cette erreur lorsque j'essayais d'implémenter un ViewCell personnalisé pour une table. Lorsque j'ai mis en surbrillance Afficher le contrôleur pour le XIB et connecté aux éléments du CellView, l'erreur "cette classe n'est pas conforme au codage de valeur de clé pour la clé" une fois que j'ai supprimé ces éléments, l'erreur a été supprimée.

Supprimez les connexions dans l'image ci-dessous. Delete the connections in inspector when File Owner is highlighted

Assurez-vous simplement que vous n’avez que les connexions avec la cellule Table View. Pour vérifier, cliquez sur la cellule de la vue tableau et dans INSPECTOR, recherchez vos connexions.

The connection should be in here when Table View Cell is highlighted

103
uplearnedu.com

Parfois, cela a à voir avec votre "Hériter de la cible" Cette valeur doit être définie. Avec des applications à cible unique, vous pouvez simplement sélectionner Hériter de la cible. Si vous avez plus d'une cible, sélectionnez-la.

enter image description here

83
mrabins

S'il s'agit d'une application pour iPhone uniquement, et non universelle, assurez-vous que le champ suivant est vide:

Cibles> Résumé> Informations sur le déploiement iPhone/iPod> Interface principale

Si vous spécifiez un xib, il se bloque.

64
erkanyildiz

Cette erreur indique qu'un Interface Builder déjà connecté l'objet est supprimé/renommé dans la source de son propriétaire (propriétaire du fichier).

Contrôle-cliquez sur le propriétaire du fichier dans l'Interface Builder si vous voyez un point d'exclamation vous devez résoudre ce problème.

Dans l'image ci-dessous, vous pouvez voir que "aRemovedView" a un point d'exclamation à sa droite, car j'ai supprimé l'objet de vue IBOutlet alors qu'il était déjà connecté à l'IB.

enter image description here

Cela donne l'erreur suivante: Arrêt de l'application en raison d'une exception non capturée 'NSUnknownKeyException', raison: '[setValue: forUndefinedKey:]: cette classe n'est pas conforme à la valeur de code pour la clé aRemovedView. '

60
Tibidabo

J'ai eu le même problème et bien que la réponse de TechZen puisse être étonnante, j'ai eu du mal à l'appliquer à ma situation.

Finalement, j'ai résolu le problème en liant l'étiquette via le contrôleur répertorié sous Objets (mis en évidence dans l'image ci-dessous) plutôt que via le propriétaire du fichier.

J'espère que cela t'aides.

enter image description here

41
Eric Brotto

dans mon cas, il s'agissait d'une erreur dans le code source du storyboard, procédez comme suit:

  1. commencez par ouvrir votre story-board en tant que code source
  2. rechercher <connections>
  3. supprimer les connexions indésirables

Par exemple:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

Comme vous le voyez, ce sont des liens entre les noms de vos variables de code et les balises XML du layout du storyboard;)

36
Fareed Alnamrouti

enter image description hereenter image description here

Ma solution était semblable à celle de Gerard Grundy. Lors de la création d'une UITableViewCell personnalisée à l'aide d'une XIB, j'avais appliqué par erreur le nom de la classe personnalisée au propriétaire du fichier plutôt qu'à UITableViewCell. Appliquer la classe à UITableViewCell sur le canevas et y connecter mes propriétés IBOutlet a résolu le problème.

33
ashack
  1. Il vous suffit de spécifier IBOutlet une fois, le libellé IBOutlet votre ivar est inutile.
  2. Installez-vous votre NIB avec votre UIViewController? À un moment donné, vous devriez appeler [SecondView initWithNibName:@"yourNibName" bundle:nil];
30
kubi

Cela ne m'arrivait que lors du débogage sur un appareil (iPhone). Le simulateur iOS fonctionnait correctement. Faire un "Produit-> Nettoyer" à partir de Xcode semblait résoudre le problème, mais je ne sais pas pourquoi.

30
Maj

Cela peut provenir du fait que vous avez le contrôle déplacé, créé un point de vente ou une action et oublié de le supprimer. Même si vous avez supprimé le code, ou même si vous avez créé assez de cmd + Z, vous devrez vous rendre dans l'inspecteur de connexion de votre storyboard et voir si l'action ou le point que vous avez créé est toujours là ou non.

23
Ilansky Naftali

J'ai eu exactement le même message d'erreur et merci (!!) à Kira de http://www.idev101.com J'ai pu résoudre le défi. Je n'ai trouvé son site qu'après avoir googlé et empilé sur tous ces fils. J'écris maintenant ici pour le prochain article qui arrive sur StackOverFlow et présente le même défi que moi, car cette personne viendra probablement sur ce fil via Google.

J'ai réalisé que j'avais fait ceci à tort:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Au lieu de cela:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

DeviceViewController

Le nom de ma classe était-il également connu sous le nom de

DeviceViewController.h 
DeviceViewController.m

Tu devras

"import DeviceViewController.h"

dans votre implémentation (fichier .m) où vous souhaitez appeler, par exemple. un autre UIViewController.

Je ne suis absolument pas désolé si je ne signale que ce qui est évident pour les débutants comme moi et risque d’obtenir des votes car cela n’a rien à voir avec la question, mais j’étais en train de chercher 4 heures (?!?) Pour obtenir la réponse à ce message d’erreur. . Si je peux épargner cela à 1 ou 2 personnes, ce serait génial :)

PS: Pour ceux intéressés par la suite du code de chargement de l’autre UIViewController:

    [self presentViewController:deviceViewController animated:YES completion:nil];
23
Yannis

En examinant les autres réponses, il semble qu’il existe de nombreuses causes possibles de cette erreur. En voici un de plus.

Si vous

  • avoir une vue personnalisée
  • ajout d'une propriété @IBInspectable
  • puis supprimé plus tard

Ensuite, vous pouvez également obtenir une erreur similaire à

Échec de la définition (xxx) de la propriété inspectée définie par l'utilisateur sur [Votre vue personnalisée] ...: cette classe n'est pas compatible avec le codage des valeurs de clé pour la clé [xxx].

La solution consiste à supprimer l'ancienne propriété.

enter image description here

Ouvrez l'inspecteur d'identité de votre classe, sélectionnez le nom de la propriété sous Attributs d'exécution définis par l'utilisateur, puis appuyez sur le bouton Moins (-).

20
Suragch

Cela m’arrive lorsque mon contrôleur de vue avait à l’origine un fichier .xib, mais que celui-ci est maintenant créé par programme.

Même si j'ai supprimé le fichier .xib de ce projet. Les utilisateurs iPhone/iPad peuvent contenir un fichier .xib pour ce contrôleur de vue.

Tenter de charger un fichier .xib provoque généralement ce blocage:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

La solution lors de sa création par programme peut être la suivante:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}
15
neoneye

La propriété "Module" de View Controller dans l'inspecteur d'identité peut être différente de ce à quoi vous vous attendiez. Assurez-vous également que de nouvelles classes sont ajoutées à votre liste de cibles.

12
ercu

J'ai eu un problème similaire pour un projet qui a deux cibles (avec leur propre MainWindow XIB). Le problème fondamental qui a causé cette erreur pour moi était que la classe UIViewController n'était pas incluse dans la liste de ressources du second projet. C'est à dire. Le constructeur d'interface m'a permis de le spécifier dans MainWindow.xib, mais au moment de l'exécution, le système ne pouvait pas localiser la classe.

C'est à dire. Faites un clic droit sur la classe UIViewController en question et vérifiez qu'elle est bien incluse dans l'onglet "Cibles".

10
David Carney

"cette classe n'est pas conforme à la codification de valeur de clé pour la clé" Je sais que c'est un peu tard mais ma réponse est différente alors je pense qu'elle doit être postée, j'ai poussé le second contrôleur de manière incorrecte. Voici un exemple

Mauvaise façon de pousser le contrôleur

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Manière correcte

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Je n'ai pas trouvé de réponse comme ci-dessus, donc cela peut aider quelqu'un qui a le même problème

9
Emy Stats

Juste pour ajouter à cela, parce que je recevais aussi cette erreur. En parcourant toutes ces réponses, la plupart des gens semblent s’appliquer au travail avec l’interface utilisateur et le scénario. Je sais que l’affiche originale a semblé fonctionner avec l’interface utilisateur, mais lors de la recherche des raisons possibles de cette erreur, toutes les questions nous ramènent à cette question. ajouter ma solution.

Je travaillais sur le codage d'un service Web dans Swift 2. J'avais créé tous les objets et stubs proxy nécessaires. Lorsque je parcourais le code XML renvoyé, je créais une instanciation dynamique de mes objets, qui provenaient tous de NSObject et utilisaient setValue:forKey. Chaque fois que setValue:forKey a essayé de définir une propriété qu’elle a détruite avec cette erreur.

J'avais une instruction switch pour chaque type que je traitais (par exemple, Bool?, CShort?, String?) et pour chaque nœud XML que j'ai parcouru et vérifié le type de type sur l'objet et a ensuite converti la valeur en ce type et a tenté de la définir avec setValue:forKey.

Finalement, j'ai commencé à commenter toutes ces lignes setValue:forKey et j'ai constaté que mon cas d'instruction default switch fonctionnait pour String?.

J'ai finalement compris que vous ne pouvez pas utiliser les types optionnels Swift avec setValue:forKey à moins qu'ils aient un mappage direct sur un type Objective-C comme String? ou NSNumber?. J'ai fini par changer tous les types CShort? en NSNumber?, car cela correspond à un mappage direct. Pour Bool? dans mon cas, je pouvais simplement utiliser Bool et l’initialiser à false. D'autres peuvent ne pas avoir ce luxe.

Quoi qu'il en soit, quel mal à la tête qui était si heureusement cela aide quelqu'un d'autre qui a un problème similaire et continue à être redirigé vers cette question et à se dire: "Je ne fais rien dans l'interface utilisateur !!".

Pour finir, pour réitérer une fois de plus, le codage clé-valeur ne fonctionne pas avec les options. Ci-dessous, j'ai fini par trouver quelque chose, mais j'oublie où, à qui que ce soit posté, je m'excuse et je donnerais crédit si je me rappelais où j'avais trouvé cela, mais cela m'a sauvé la vie:

Vous ne pouvez pas utiliser KVC sur une propriété facultative Int, car KVC est Cocoa/Objective-C et qu'Objective-C ne peut pas voir un Int facultatif - il n'est pas ponté en Objective-C. Objective-C ne peut voir que les types pontés en Objective-C:

types de classe dérivés de NSObject

types de classe exposés avec @objc

Structures rapides qui sont pontées

9
AtheistP3ace

Ce pourrait être le cas de la référence à un composant de l'interface Xib que vous avez renommé ou supprimé. Le re-référencement fonctionne pour moi.

8
MehrozKarim

Je viens d'avoir ce problème dans mon projet dupliqué et résolu en vérifiant 2 endroits:

1- Assurez-vous que le fichier .m est dans la liste -> Projet - Phases de construction - Compiler les sources
2- Ensuite, accédez au générateur d’interface (il s’agit probablement d’une erreur avec uniquement IB) et dissociez toutes les propriétés, étiquettes, images, etc. Ensuite, rapprochez tous les liens. J'ai réalisé que j'avais supprimé un attribut mais qu'il était toujours lié dans IB.

J'espère que cela fonctionne pour certains.

8
kubilay

Cette erreur est autre chose!

Voici comment je l'ai corrigé. J'utilise xcode version 6.1.1 et j'utilise Swift. J'ai eu cette erreur chaque fois que mon application a essayé d'effectuer une transition pour passer à l'écran suivant. Voici ce que j'ai fait.

  1. Vérifié que le bouton était connecté à la bonne action (ce n'était pas le problème, mais ça reste bon à vérifier)
  2. Vérifiez que le bouton ne contient aucune action ou sortie supplémentaire créée par erreur. (Ce n'était pas le problème, mais bon à vérifier)
  3. Vérifiez les journaux et assurez-vous que tous les boutons de l'ECRAN SUIVANT ont les actions correctes. S'il y a des légendes, assurez-vous qu'elles ont un identifiant unique. (C'était le problème)
    • Une des ligues n'avait pas d'identifiant unique
    • Un des boutons avait une action et deux sorties que j'ai créées par erreur.
    • Supprimez tous les points de vente supplémentaires et assurez-vous que vous passez à l'écran suivant avec des identifiants uniques.

À votre santé,

7
Ronaldoh1

Un autre problème "non conforme" que j'ai trouvé est celui où j'ai réussi à avoir deux copies d'une classe pour une raison quelconque.

J'ajoutais des clés à la mauvaise copie. Interface Builder voyait toujours les clés et me permettait de les utiliser, mais au moment de l'exécution, il utilisait l'autre copie de la classe qui ne possédait pas les nouvelles clés.

Pour trouver quelle était la "bonne" copie, j'ai utilisé la commande cmd de XCode sur le nom de la classe pour passer à la copie correcte, puis j'ai supprimé les mauvaises copies inutilisées (après avoir importé en premier mes modifications de la copie non utilisée).

Morale de l'histoire: les fichiers de classe en double sont mauvais.

7
Jason

Si vous avez une sous-classe UIViewController personnalisée avec IBOutlets qui causent des problèmes, la seule série d’étapes que j’ai trouvée pour éliminer réellement l’erreur était

.1 Changez la classe en UIViewController

.2 Débranchez toutes les prises (elles auront toutes le triangle d'avertissement jaune à présent) - il suffira peut-être simplement de débrancher la ou les prise (s) posant problème.

.3 Effectuez toutes les étapes standard - ↑ K, supprimez les données dérivées (tapis de prière, perles d'inquiétude).

.4 Lancez l'application - allez à la scène problématique.

.5 Kill the app, retournez à Interface Builder, changez la classe en votre nom de classe personnalisé.

.6 Rebranchez vos prises.

Lancez l'application et cela aura normalement résolu les problèmes de conformité valeur-clé.

6
Damo

J'ai eu le même symptôme. La cause principale était que "l'appartenance à la cible" de mon fichier source n'était pas défini sur la bonne cible. Je suppose que cela signifie que ma classe ne serait pas construite et incluse dans mon application.

Pour le corriger:

  1. Mettez en surbrillance votre fichier .m.
  2. Dans le volet de droite, sélectionnez l'inspecteur de fichier.
  3. Sous la section "Adhésion à la cible", assurez-vous que la cible de construction appropriée est cochée.

J'espère que cela aide quelqu'un là-bas.

6
Mike M. Lin

Dans mon cas. Après la fusion, je n'avais pas de sorties manquantes dans les fichiers xib.

Maj + Commande + K

résolu mon problème. J'ai nettoyé mon projet et reconstruit.

5
Malder

Dans mon cas, cela était dû à la référence au mauvais Nib:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
4
wspruijt

J'ai eu le même genre de problème. J'ai créé une tableviewCell dans un fichier XIB et obtenais ce genre d'erreur. Mon problème était que j'ai défini la classe "Propriétaire du fichier" comme étant mon contrôleur de vue de cellule. Je viens juste de le sortir et de définir la classe de la cellule (sur le fichier xib, cliquez sur le bord de la cellule, allez au troisième onglet du panneau de droite et indiquez que la classe a choisi votre contrôleur de vue).

Essayez également de nettoyer votre code.

3
pedrotorres

J'ai le même problème. J'ai réinitialisé le simulateur. Supprimer et ajouter un contrôle de bouton. et a finalement fait un nettoyage. :) Merci au débordement de pile. Certains comment mon code est devenu bon et commence à fonctionner.

3
priya

Vous pouvez avoir des points de vente vers l'élément d'interface utilisateur, mais pas la propriété IBOutlet dans le fichier .h

Pour tous les éléments d'interface utilisateur dans les sorties de contrôle d'attribut de connexion et la propriété correspondante dans le fichier d'en-tête .h.

Il peut manquer une ou plusieurs entrées de propriété dans le fichier .h.

3
Avinash Jadhav

Je recevais cette erreur avec les storyboards. La solution ci-dessus ne semblait pas être le problème, alors j'ai fini par supprimer le contrôleur de vue et le rajouter (et bien sûr, en reconnectant la séquence et en réaffectant la classe) qui l'a corrigé. Je ne sais pas ce que c'était vraiment, mais j'avais renommé la classe du contrôleur de vue associée peu de temps avant le début du processus, alors peut-être que cela avait posé problème.

3
Symmetric

Vérifiez si vous avez des prises de référence distantes en sélectionnant l'objet incriminé dans l'interface Storyboard/xib et en ouvrant l'inspecteur de connexions (Affichage-> Utilitaires-> Afficher l'inspecteur de connexions). Si vous supprimez les connexions indésirables, vous devriez être prêt à partir.

J'ai eu le même problème. Cela est arrivé avec mon projet parce que j'ai changé le nom de mon produit, mais dans le constructeur d'interface, l'ancien nom était Module, cela entraînait un blocage. Assurez-vous de vérifier que le nom du module xib a également été modifié ou non.

2
Jyotsna

J'ai supprimé la propriété du fichier d'en-tête. Je ne pouvais trouver aucune référence à cela, mais l'erreur de débogage le référençait toujours. J'ai trouvé que le fichier nib contenait toujours une référence. J'ai supprimé le bloc qui l'a référencé et tout a été corrigé.

Dans le navigateur de projet,

Recherchez le fichier Nib (xib). Clic droit et Voir la source. J'ai supprimé la section complète suivante

<object class="IBConnectionRecord">
    <object class="IBCocoaTouchOutletConnection" key="connection">
        <string key="label">DeleteLabel</string>
        <reference key="source" ref="372490531"/>
        <reference key="destination" ref="774585933"/>
    </object>
    <int key="connectionID">20</int>
</object>
2
Apple Pirate

Vous devrez peut-être supprimer le point de vente, le recréer en dessinant le formulaire IB dans le fichier .H.

2
IsPha

Cela m’arrive aussi quand une étiquette d’interface utilisateur ou un autre élément d’interface utilisateur est référencé par deux variables dans la classe du contrôleur de vue et que je supprime l’une des variables.

2
sysuser

Cela s'est produit lorsque j'ai eu un UIView lié à un storyboard et à un IBOutlet connecté, comme:

@property (strong, nonatomic) IBOutlet UIView *someView

mais plus tard, j'ai transformé UIView en classe personnalisée, mais j'ai oublié de changer le nom de classe de cet IBOutlet défini ci-dessus. C'est une erreur étrange car si la vue personnalisée n'a pas de sous-vues, elle ne se plaint pas, mais dès qu'il y a des sous-vues, l'erreur indiquée dans la question apparaît, mais sur l'une des sous-vues et non sur la vue UIV externe où le problème existe réellement. m'a fait supprimer et lire toutes les sous-vues en essayant de trouver le problème, alors qu'en réalité, cela n'avait rien à voir avec les sous-vues

1
Fonix

Dans mon cas,

[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]

était la raison.

en remplaçant ceci par initWithNibName, résolu.

1
Deve Tester

J'avais le même problème lorsque j'utilisais le scénarimage principal en tant que fichier d'écran de lancement. J'imagine que si vous utilisez un storyboard comme fichier d'écran de lancement, il ne devrait pas être connecté au contrôleur de vue car il n'a pas encore été chargé.

1
IanS

J'ai résolu ce problème en faisant 2 choses:

  1. Référence de classe fixe de la vue:

  1. Réimporté tous les points de vente:

1
Bogdan Kobylynskyi

Une autre cause de cette situation est que vous déclarez cette propriété implémentée en tant que @dynamic, mais class ne peut pas la trouver dans la classe parente.

1
Artem Shmatkov

Cela peut vouloir dire que vous essayez d'utiliser un descripteur de tri sans un atsign au début. Un péché:

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

Qui doit être réellement:

[array valueForKeyPath:@"@distinctUnionOfObjects.self"]

1
CommaToast

Cela m'est déjà arrivé deux fois.

La solution consistait à refaire le storyboard en entier puisque je l'avais copié d'un autre (parce que c'était presque pareil)

1
Rafael Ruiz Muñoz

J'ai eu le même problème, et la cause était due à la spécification d'un module dans Interface Builder (au lieu de le laisser vide). Ainsi, lorsque j'utilisais un module différent de celui que j'avais défini, l'application se bloquait: S ... espérons que cela aide quelqu'un d'autre, car mon problème n'était pas dû à un point de vente cassé ou obsolète!

1
Chris Allinson

Avec d'autres problèmes que vous pouvez voir dans d'autres réponses. La façon dont j'ai créé cette erreur est que j'ai démarré un projet à partir de rien et que j'ai commencé par effacer la scène initiale de mon storyboard, puis que j'ai collé une scène d'un autre projet dans mon storyboard.

Cela ne pose aucun problème. Il vous suffit d’ajouter un point d’entrée de votre storyboard, c’est-à-dire vérifier le is initial View Controller sur le contrôleur de vue de votre choix. Sinon, ce sera une scène grise et vous jettera une erreur.

enter image description here

1
Honey

Même problème présenté. Ma solution a été de mettre la valeur de storyboard correcte dans le menu déroulant Storyboard principal. J'avais renommé mainstoryboard.storyboard, mais je n'ai pas réinitialisé les informations de déploiement.

1

J'ai rencontré le même problème pour une raison différente: j'utilisais le scénarimage principal en tant que fichier d'écran de lancement. Je suppose que si vous utilisez un storyboard en tant que fichier d'écran de lancement, il ne devrait pas être connecté au contrôleur de vue, car il n'a pas encore été chargé.

1
IanS

J'ai eu ce problème avec les classes Swift après la mise à niveau vers xcode7. Résolu en utilisant la directive @objc:

@objc (XXXViewController) classe XXXViewController

1
user1760527

Mon problème a commencé après que j'ai changé le nom de la cible.

Dans mes classes d'interface utilisateur personnalisées, le nom du module était défini sur l'ancien nom de la cible.

J'ai changé le nom de la cible pour le nouveau et cela fonctionne bien maintenant.

1
MBH

Dans mon cas, le nom de propriété d'un objet IBOutlet dans ViewController.m a été modifié, mais pas celui de Storyboard. Réintroduire IBOutlet dans ViewController.m par un clic-glisser a résolu le problème. J'ai aussi remarqué un moyen de trouver de tels "orphane" IBOutlets dans XCode: (regardez l'image), ceux qui ne sont pas "orphelins" ont des cercles concentriques au lieu de numéros de lignes.

"Orphaned" IBOutlets don't have concentric circles in the line number column.

1
Roman Reimche

J'ai eu ce problème avec le storyboard et la classe Swift pour le contrôleur de vue ui. Résolu en utilisant la directive @objc:

@objc(MyViewController) class MyViewController
1
user1760527

Je rencontre le même journal d'erreur lorsque je traite avec ma cellule tableview. J'ai constaté que mes étiquettes UIL avaient des sorties de référencement dupliquées (vous pouvez le vérifier dans l'inspecteur de références) à la fois pour le propriétaire du fichier et pour la classe de ma cellule. Les choses vont bien quand je supprime la référence au propriétaire du fichier.

0
JackieLam

Avez-vous laissé votre objet sélecteur non connecté?

lol 54 réponses et aucune d'elles n'est ma solution. Parlez d'une erreur commune.

Dans mon cas, c’était parce que j’avais un objet sélecteur sur mon VC et que je n’avais pas défini de sortie ni d’action pour cela.

Je laisse souvent des boutons, etc., sans lien lorsque je cherche simplement à voir à quoi ressemble la mise en page. Mais il semble que vous ne pouvez pas faire cela pour un cueilleur.

0
tymac

J'ai eu la même erreur quand j'ai chargé manuellement une vue à partir d'une plume. Il s'avère que j'avais oublié de définir le propriétaire de la vue.

Par exemple Si vous chargez une vue de la manière suivante,

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: nil,
                                 options: nil)?.first as! UIView

et puis ajoutez un IBOutlet, le IBOutlet ne peut pas être référencé et l'application se plantera avec l'erreur ci-dessus.

Correction: Attribuez un propriétaire pour la vue.

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: self,
                                 options: nil)?.first as! UIView
0
Abhi

Faites juste attention si vous essayez d'observer une valeur qui n'existe pas.

Cela m'est arrivé simplement alors que j'observais la propriété "Text" d'un champ de texte alors que j'étais supposé observer la propriété "text" à la place.

0
Ahmed Elashker

J'ai eu la même erreur sous une autre forme légèrement différente:

Dans le constructeur d'interface, j'ai un contrôleur de navigation avec un sous-contrôleur personnalisé. Le nom de la classe de celui-ci a été défini correctement, mais le nom de la NIB (sélectionnez le sous-contrôleur, puis sur Inspecteur d'attributs) a été défini sur le mauvais fichier (essentiellement sur une cible différente). Réinitialiser cela sur le nom de fichier correct a résolu le problème.

0
sgvd

La cause de mon problème était que j'ai dupliqué un fichier de story-board (en dehors de Xcode si je me souviens bien), puis tous les contrôleurs de vue dans le fichier dupliqué avaient le même ID d'objet que dans le fichier d'origine. Le remède consiste à copier-coller les contrôleurs de vue, qui obtiendront ensuite un nouvel ID d'objet. Vous pouvez voir l'ID d'objet dans l'inspecteur d'identité.

0
Olle Raab

Dans mon cas, j'avais ajouté un ViewController au storyboard, mais je ne lui avais pas attribué d'identifiant de Storyboard dans le concepteur. Une fois que je lui ai donné un identifiant, cela a fonctionné.

en utilisant Xamarin/Visual Studio 2015.

0
Wes

Assurez-vous d’ajouter l’implémentation (même vide) de la classe personnalisée dans le fichier .m comme:

@implementation MySubclass
@end
0
Iulian Onofrei

J'ai trouvé une autre possibilité qui pourrait causer le problème.

L'utilisation de la méthode "initWithNibName" avec un nom de fichier xib incorrect entraîne également ce type de blocage.

Telle que vous choisissez de changer le nom d'un fichier xib, puis foget pour changer le nom utilisé dans la méthode "initWithNibName" par le même nom.

0
Li Fumin

Parfois, les fichiers Swift ne sont ni ajoutés ni supprimés de la cible, accédez à la cible -> Paramètre de construction -> compilez les sources -> voyez si un fichier requis Swift est manquant ou non. . Dans mon cas, l'application se bloquait car le fichier source Swift n'était pas présent lors de la compilation.

0
jatin

J'ai eu ce problème également. J'avais copié une vue avec un IBOutlet d'un fichier xib vers un autre fichier xib. Et même si j'avais supprimé l'ancienne référence et créé une nouvelle référence, cette erreur se produisait toujours.

J'ai fini par redémarrer xcode pour résoudre ce problème.

0
Rickster

Habituellement, lorsque cela m'arrive, la réponse de @ TechZen fait l'affaire. Hier, cependant, j’ai passé beaucoup de temps embarrassant à jongler avec des connexions de storyboard pour découvrir que le problème se trouvait dans mon code.

J'ai un contrôleur de vue personnalisé qui gère différentes dispositions dans mon storyboard, mais l'une des dispositions nécessitait une étiquette spéciale non utilisée par les autres. J'ai donc créé une sous-classe comme celle-ci:

@interface MyViewControllerSubclass : MyViewController

Puis j'ai ajouté une propriété privée dans MyViewControllerSubclass.m:

@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end

Xcode m'a heureusement permis de connecter cet IBOutlet, mais à chaque chargement de la vue, l'application plantait avec l'ancien "non conforme à la valeur clé pour la clé 'chrashesApp'".

La solution, quasi-évidente rétrospectivement, consistait à changer la catégorie privée pour utiliser le nom correct, c’est-à-dire celui de sous-classe:

@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end
0
clozach

Je me souviens avoir eu un problème similaire dans le passé, je l'ai résolu en changeant la ligne:

_vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil];

dans:

#include "vicLogin_iPad.h"       // This is the H file of the class holding the code for
                                 // processing all the IBOUtlets for the Login screen
.
.
.

_vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil];

Notez que je déclarais initialement que UIViewController initialisait _vicMain. Après avoir utilisé une fenêtre contextuelle au-dessus, j'ai réalisé que les deux utilisaient le même UIViewController.

Par:

1) INCLUANT votre classe (de la sous-vue), ainsi que le même module effectuant le _vicMain ci-dessus (qui est un objet/une variable de contrôleur de vue), c’est-à-dire "vicLogin_iPad.h" dans mon cas, et:

2) Utilisez le constructeur personnalisé pour déclarer l’objet (c’est-à-dire que, au lieu de "xxx = [UIViewController alloc] ...", vous utilisez "xxx = [vicLogin_iPad alloc] ...".

le problème est résolu.

J'espère que cela vous aidera, car il a été difficile d'identifier avec le manque de détails du message d'erreur ...

Cordialement Heider Sati

0
Heider Sati

Ce problème se produit également si vous souhaitez concevoir une petite sous-vue dans un fichier XIB distinct dans Interface Builder et si vous le définissez dans IB avec la même classe que la vue parent.

Si vous le montrez ensuite comme ceci:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
[self.view addSubview:vc.view];

La vue apparaîtra, mais si IBOutlets est connecté à son propriétaire, le message d'erreur s'affiche. Donc, cela devrait fonctionner à la place:

  1. Dans le code de la vue parent, déclarez un IBOutlet UIView *mySubview pour référencer la vue dans le fichier nib de la sous-vue.
  2. Dans le fichier nib de la sous-vue, connectez le propriétaire du fichier à la vue et définissez-le sur mySubview.
  3. montrez-le en faisant:
 [[NSBundle mainBundle] loadNibNamed: @ propriétaire "NameOfTheSubviewNibFile": auto options: nil] 
 [Auto.view addSubview: mySubview]; 

et tout ira bien!

0
Eric

n autre cas délicat:

Dans IB, ViewController a été ajouté au storyboard, a supprimé sa vue et a défini Custom Class sur "MyViewController" afin que la vue soit instanciée à partir de MyViewController.xib.

Spécifier l'ID de Storyboard avec le même "MyViewController" provoque une exception.

Changer l'ID de Storyboard sous un nom différent résout le problème.

0
Vladimir Borodko