web-dev-qa-db-ja.com

キャッチされない例外:このクラスはキー値コーディングに準拠していません

私は 「iOS用のSwiftチュートリアル:NSFileManager Persisting Data」というタイトルのチュートリアル をフォローしていますが、29分前後にエラーが発生しました。 iOSシミュレーターで実行しようとすると、次のエラーが表示されます。

キャッチされない例外 'NSUnknownKeyException'によるアプリの終了、理由: '[setValue:forUndefinedKey:]:このクラスは、キーtheLoadMethodのキー値コーディングに準拠していません。

明らかにエラーに基づいて、問題は私のtheLoadMethodであると考えています。 ViewControllerでこのプロジェクトの一部として作成したコードは、allです。

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
}

私が間違っていることはありますか?私の知る限り、画面上のiOS要素はすべて正しく名前が付けられ、リンクされています。

55

これは通常、ストーリーボードから存在しないプロパティへのリンクが原因です。ストーリーボードのオブジェクトからのすべてのリンクを再確認してください。また、プロパティまたはメソッドの名前またはスペルを変更した場合でも、古いものへの参照を保持できます。

117
Paulw11

同じ問題に直面しており、IBOutletが正常であることをすでに確認している場合(少なくともInterface Builderで正常に表示されます):View Controllerのモジュール(添付画像を参照)が「Current-$ (PROJECT_NAME)」。 enter image description here

60

私は同様の問題を抱えていました。ユーザーが必要とするフィールドを変更し、いくつかのフィールドの名前を変更しました。

必要なすべての変更を解析で行いました(列を削除して追加しました)。バックエンドは問題ではありませんでした。

インターフェイスビルダーのソースコードには、まだ古い属性が含まれています。

解決するには、main.storyboardを右クリックし、[名前を付けて開く]-> [ソースコード]をクリックします。削除または名前を変更したフィールドを検索します。

あなたの場合、theLoadMethodの名前を別のものから変更しましたか?

これが誰かを助けることを願っています。

乾杯!

20
Ronaldoh1

右クリックして[ソースコード]タブを選択してMain.storyboardコードに移動し、保存されている以前のエントリを削除します(アプリケーションは以前のエントリを保存し、それを削除します)。

3
Nitish Kanade

同様のエラーが発生しました。更新後にXCodeの設定でBuild LocationをCustomに変更することで問題を解決しました。このフィールドを「ワークスペースに相対」に設定するだけです。

0
Lyanch