web-dev-qa-db-fra.com

Exception non capturée: cette classe n'est pas compatible avec le codage des valeurs de clé

Je suis un didacticiel intitulé "Swift Tutorial pour iOS: données persistantes de NSFileManager" et j'ai rencontré une erreur autour ou après la limite des 29 minutes. Lorsque j'essaie de l'exécuter sur le simulateur iOS, je reçois le message d'erreur:

Arrêt de l'application en raison d'une exception non interceptée 'NSUnknownKeyException', raison: '[setValue: forUndefinedKey:]: cette classe n'est pas conforme au codage des valeurs de clé pour la clé theLoadMethod.

Évidemment, en me basant sur l'erreur, je pense que le problème est ma theLoadMethod. Voici all le code que j'ai écrit dans le cadre de ce projet dans ViewController:

let theDocumentsFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let theFileName     = "/theUserFile.txt"
let thePath         = theDocumentsFolder.stringByAppendingString(theFileName)


class ViewController: UIViewController {

@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var lastNameTextField: UITextField!
@IBOutlet weak var ageTextField: UITextField!

@IBOutlet weak var theLabel: UILabel!

// The save method
@IBAction func theSaveMethod(sender: AnyObject) {
    var name        = nameTextField.text
    var lastName    = lastNameTextField.text
    var age         = ageTextField.text

    var theString   =   "The user's information is: \(name), \(lastName), \(age)"

    let theFileManager = NSFileManager.defaultManager()

    if !theFileManager.fileExistsAtPath(thePath) {

        var writeError:NSError?
        let fileToBeWritten = theString.writeToFile(thePath, atomically: true, encoding: NSUTF8StringEncoding, error: &writeError)

        if writeError == nil {
            println("No errors. Added: \(theString)")
        } else {
            println("Encountered an error. Error is: \(writeError)")
        }

    } else {
        println("File already exists")
    }

    nameTextField.resignFirstResponder()
    lastNameTextField.resignFirstResponder()
    ageTextField.resignFirstResponder()
}

@IBAction func theLoadMethod(sender: AnyObject) {
    let infoFromFile:String = String.stringWithContentsOfFile(thePath, encoding: NSUTF8StringEncoding, error: nil)!

    theLabel.text = infoFromFile
}

Y a-t-il quelque chose que je fais mal? Autant que je sache, tous mes éléments iOS à l'écran sont correctement nommés et liés. 

54

Ceci est normalement causé par un lien de votre storyboard vers une propriété inexistante. Vérifiez tous les liens des objets dans votre storyboard. De même, si vous avez modifié le nom ou l’orthographe d’une propriété ou d’une méthode, celle-ci peut toujours faire référence à l’ancienne. 

115
Paulw11

Pour ceux qui sont confrontés au même problème et qui se sont déjà assurés que les IBOutlets sont corrects (au moins, tout se passe bien dans Interface Builder): Actuel - $ (PROJECT_NAME) ".enter image description here

60
Arthur Gevorkyan

J'avais un problème similaire. J'avais changé les champs requis par l'utilisateur et renommé quelques champs. 

J'ai fait tous les changements nécessaires dans l'analyse (colonnes supprimées et ajoutées). Le backend n'était pas le problème. 

Le code source de votre générateur d'interface contient toujours les anciens attributs. 

Pour résoudre le problème, cliquez avec le bouton droit sur main.storyboard -> Ouvrir en tant que -> Code source .... recherchez les champs que vous avez supprimés ou renommés ... supprimez-les ou modifiez-les ... cela dépend des modifications que vous avez apportées. 

dans votre cas, avez-vous renommé theLoadMethod autrement?

espérons que cela aide quelqu'un là-bas. 

À votre santé! 

20
Ronaldoh1

Accédez simplement à votre code Main.storyboard en cliquant avec le bouton droit de la souris et en sélectionnant l’onglet Code source, puis supprimez l’entrée précédente enregistrée (l’application stocke les entrées précédentes, supprimez-la simplement).

3
Nitish Kanade

J'ai aussi rencontré une erreur similaire. J'ai résolu le problème en modifiant l'emplacement de construction en Personnalisé dans les paramètres de XCode après l'avoir mis à jour. Il suffit de définir ce champ sur "Relative à l'espace de travail" et c'est tout.

0
Lyanch