4
votes

Swift cette classe n'est pas compatible avec le codage des valeurs de clé pour l'erreur de clé

Je reçois une erreur Fin de l'application en raison d'une exception non interceptée

extension UIView {
    func loadNib() -> UIView {
        let bundle = Bundle(for: type(of: self))
        let nibName = type(of: self).description().components(separatedBy: ".").last!
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as! UIView
    }
}

J'ai XIB appelé "notEkle" et à l'intérieur de "notEkle" j'ai UITextView et le fournisseur XIB est ViewController. Lorsque je connecte ce texte avec le contrôleur, j'ai cette erreur. Je charge mon XIB dans le contrôleur comme

let notEkleView: UIView =  NotEkle().loadNib() as UIView

Je connecte ma vue de texte avec un contrôleur comme

@IBOutlet weak var notEkleTextView: UITextView!

Je n'ai aucun problème avant de connecter UITextview et le contrôleur.

let notEkleView: UIView =  NotEkle().loadNib() as UIView
'NSUnknownKeyException', reason: '[<KGM_IOS.NotEkle 0x7fcb5ee0cd40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key notEkleTextView.'.


2 commentaires

Vous feriez mieux d'écrire vos lignes de code entre les lettres afin d'améliorer la lisibilité de votre question.


Copie possible de Qu'est-ce que cela signifie? "'NSUnknownKeyException', raison:… cette classe n'est pas compatible avec le codage des valeurs de clé pour la clé X"


7 Réponses :


0
votes

Juste après la déclaration de la classe, connectez la sortie comme faites-la glisser du fichier xib vers la classe (propriétaire) et cela devrait ressembler à:

@IBOutlet weak var notEkleTextView: UITextView!

comme dans votre cas, cela ne fonctionne pas, cela signifie que vous avez donné une autre classe

Votre contrôleur de vue a peut-être la mauvaise classe dans votre xib. Vérifiez le propriétaire du fichier et dans VC vérifiez l'inspecteur de fichiers si les classes ont été correctement attribuées


2 commentaires

J'ai vérifié mais c'est connecté. Le cercle que le côté gauche de @IBOutlet faible var notEkleTextView: UITextView! est rempli


avez-vous vérifié les propriétaires de fichiers de classes, etc. utilisez aussi simplement: Bundle.main.loadNibNamed ("yournibname", owner: self, options: nil) ne le rendent pas complexe



2
votes

Il existe plusieurs étapes pour définir un XIB et l'utiliser par programme.

  1. Vous devez d'abord créer le fichier XIB et le fichier Swift avec le même nom.

  2. Concevez selon vos besoins, puis connectez le propriétaire du fichier au nom de classe que vous avez défini à l'étape 1.

  3. Vous devez définir une méthode d'initialisation commune et remplacer les deux initialiseurs (avec frame et coder).

  4. Connectez toute la vue dans XIB en tant qu'IBOutlet dans la classe Swift.

  5. Implémentez l'initialiseur commun comme suit:

private func commonInitializer() {
    Bundle.main.loadNibNamed("testView", owner:self, options: nil)
    addSubview(contentView)
    contentView.frame = self.bounds
    contentView.autoresizingMask = [.flexibleHeight,.flexibleWidth]
}
  1. Enfin, vous pouvez faire glisser un UIView n'importe où et définir sa classe comme classe personnalisée.

Pour plus de détails, vous pouvez consulter ce tutoriel ici


0 commentaires

0
votes

Veuillez vous assurer de suivre:

  1. Dans xib, définissez la classe de base de votre vue sur NotEkle.
  2. Instanciez comme ceci, let notEkleView = NotEkle().loadNib() as! NotEkle

0 commentaires

0
votes

Cette classe n'est pas compatible avec le codage des valeurs de clé pour la clé

Cela se produit lorsque les prises ne sont pas correctement connectées du storyboard à un contrôleur de vue.


0 commentaires

2
votes

Tout allait bien pour moi mais j'obtenais toujours cette erreur, puis je l'ai résolue en

  • Activation du module "Hériter du module de la cible" dans l'inspecteur d'identité. ou
  • Donner le module (généralement le nom du dossier / nom du groupe) dans lequel il est présent à partir de l'inspecteur d'identité sous Classe personnalisée

1 commentaires

Cela doit être fait pour l'objet xib lui-même. Il y a aussi un endroit pour remplir cela dans les mêmes informations sur le propriétaire du fichier (dans la section Espaces réservés au-dessus de l'objet), mais cela ne résoudra pas le problème.



0
votes

Assurez-vous que vous avez entré correctement "nibName" dans la fonction init ScreentShot attaché

init(pages : [Page],holder : UIView) {
    self.pages = pages
    self.holder = holder
    super.init(nibName: "PagerViewNew", bundle: nil)
}

J'ai mis "PagerView" au lieu de "PagerViewNew"


0 commentaires

0
votes

J'ai reconstruit mon projet et ajouté les storyboards que j'ai obtenus et j'ai obtenu cette erreur. Je l'ai résolu en sélectionnant le module du bon projet. Storyboard> ViewController> Inspecteur d'identité> module


0 commentaires