60

我正在关注一个名为“Swift Tutorial for iOS : NSFileManager Persisting Data”的教程,我在 29 分钟左右或之后遇到了一个错误。当我尝试在 iOS 模拟器上运行它时,我收到以下错误:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类与键 theLoadMethod 的键值编码不兼容。”

显然基于错误,我认为问题出在我的theLoadMethod. 这是我在 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
}

有什么我做错了吗?据我所知,我在屏幕上的所有 iOS 元素都已正确命名和链接。

4

5 回答 5

118

这通常是由情节提要与不存在的属性的链接引起的。仔细检查故事板中对象的所有链接。此外,如果您更改了属性或方法的名称或拼写,它仍然可以引用旧的。

于 2014-10-14T05:55:09.197 回答
61

对于那些面临同样问题并且已经确保 IBOutlets 没问题的人(至少在 Interface Builder 中看起来不错):确保您的视图控制器的模块(参见附图)设置为“当前 - $ (项目名称)”。 在此处输入图像描述

于 2015-04-17T14:37:11.127 回答
23

我遇到了类似的问题。我更改了用户所需的字段并重命名了几个字段。

我在 parse 中进行了所有必要的更改(删除和添加列)。后端不是问题。

您的界面构建器源代码仍包含旧属性。

要解决右键单击 main.storyboard -> 打开为 -> 源代码....查找您删除或重命名的字段...删除或修改它们...这取决于您所做的更改。

在您的情况下,您是否从其他名称重命名了 theLoadMethod?

希望这可以帮助那里的人。

干杯!

于 2015-01-23T05:09:53.347 回答
3

只需通过右键单击并选择源代码选项卡导航到 Main.storyboard 代码,然后删除存储的上一个条目(应用程序存储以前的条目,只需删除它)。

于 2015-07-11T00:53:19.880 回答
0

我也遇到了类似的错误。我通过在更新后将 XCode 设置中的 Build Location 更改为 Custom 解决了这个问题。只需将此字段设置为“相对于工作区”即可。

于 2015-07-07T13:20:22.247 回答