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.
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
.
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:
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.
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):
Je devais supprimer l'application du simulateur/iPhone pour éliminer cette erreur.
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.
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.
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.
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.
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. '
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.
dans mon cas, il s'agissait d'une erreur dans le code source du storyboard, procédez comme suit:
<connections>
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;)
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.
IBOutlet
une fois, le libellé IBOutlet
votre ivar est inutile.UIViewController
? À un moment donné, vous devriez appeler [SecondView initWithNibName:@"yourNibName" bundle:nil];
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.
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.
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];
Où
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];
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
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é.
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 (-).
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];
}
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.
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".
"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
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
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.
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.
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.
À votre santé,
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.
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é.
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:
J'espère que cela aide quelqu'un là-bas.
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.
Dans mon cas, cela était dû à la référence au mauvais Nib:
BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
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.
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.
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.
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.
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.
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>
Vous devrez peut-être supprimer le point de vente, le recréer en dessinant le formulaire IB dans le fichier .H.
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.
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
Dans mon cas,
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]
était la raison.
en remplaçant ceci par initWithNibName, résolu.
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é.
J'ai résolu ce problème en faisant 2 choses:
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.
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"]
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)
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!
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.
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.
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é.
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
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.
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.
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
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.
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.
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
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.
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.
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é.
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.
Assurez-vous d’ajouter l’implémentation (même vide) de la classe personnalisée dans le fichier .m
comme:
@implementation MySubclass
@end
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.
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.
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.
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
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
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:
IBOutlet UIView *mySubview
pour référencer la vue dans le fichier nib de la sous-vue.mySubview
.[[NSBundle mainBundle] loadNibNamed: @ propriétaire "NameOfTheSubviewNibFile": auto options: nil] [Auto.view addSubview: mySubview];
et tout ira bien!
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.