【问题标题】:Uncaught exception: This class is not key value coding-compliant [duplicate]未捕获的异常:此类不符合键值编码[重复]
【发布时间】:2014-12-08 19:23:56
【问题描述】:

我正在关注a tutorial titled "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 元素都已正确命名和链接。

【问题讨论】:

  • 这通常是由您的故事板链接到不存在的属性引起的。仔细检查故事板中对象的所有链接
  • @Paulw11 我该怎么做?只需查看情节提要中每个对象名称的名称,并确保它们与我的 IBOutlet 声明相匹配?
  • 选择您的每个控件、文本字段等,并在检查器窗口中检查它们的引用出口。
  • @Paulw11。只有 6 个元素:3 个文本字段、2 个按钮和 1 个标签。每个参考插座看起来都不错。按钮被声明为 IBAction 函数,其余的是 IBOutlets...
  • 您可以控制或右键单击您的情节提要并作为源代码打开并使用 cmd-f 搜索加载方法。有些东西指的是剧院属性名称

标签: ios swift cocoa-touch nib nsunknownkeyexception


【解决方案1】:

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

【讨论】:

  • 谢谢!这才是真正起作用的!我来自程序员背景(C++、Python、Java……),虽然我喜欢所有不错的 UI 功能,比如从 Storybody 拖到代码中,但我感到不安,因为我真的不知道发生了什么在幕后。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    对于那些面临同样问题并且已经确保 IBOutlets 没问题的人(至少在 Interface Builder 中看起来没问题): 确保您的视图控制器的模块(参见附图)设置为“当前 - $(PROJECT_NAME)”。

    【讨论】:

    • 听到这个消息很难过。但究竟什么是行不通的?此外,答案本身从未被视为万灵药。
    • @Rocotilos,如果您的项目中有多个目标,则模块字段的值应与包含 .xib/.storyboard 文件的目标名称相同。
    • 最初我认为这个答案不起作用 - 但只是发现我必须“刷新”类(通过重新输入类名),并将占位符文本添加到模块场地。谢谢!
    • 你说的是文件的所有者吧?好吧,我再次输入类名,但模块仍然显示:“无”
    • +1 用于解决我的问题。这让我生气了好几个小时。为什么新添加的视图控制器的默认值是 none 我永远猜不到这是否会发生。
    【解决方案4】:

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

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

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

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

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

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

    干杯!

    【讨论】:

    • @Ronaldoh1 非常感谢您的提示:“右键单击 main.storyboard -> 打开为 -> 源代码....查找您删除或重命名的字段...删除或修改它们。”这帮助我找到了我从故事板和编码器版本控制器中删除的被诅咒的按钮,但在我阅读你的提示之前仍然让我头疼了一个小时。
    • 谢谢。发生在我身上的是,它将任何出口分配给文件的所有者,而不是直接分配给源。我所做的只是作为源代码打开并删除了文件所有者的类名。再次感谢
    • 谢谢,这太棒了,对我有用。
    • 哇,这可能需要很长时间才能找到,完美!
    • 感谢您揭露这一点。解决了我的问题:)
    【解决方案5】:

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

    【讨论】:

    • 可以在项目导航器中搜索有问题的插座(在调试器中引用),它将被标记出来。通过点击旁边的 x 删除(而不是通过导航器选择并点击删除按钮)。
    • tech-recipes.com/rx/52021/… 我遇到了同样的问题并且已经修复,也许这个链接也可以帮助其他人
    • 这也可能发生在复制故事板上的场景/视图并重新链接到不同的视图控制器类之后。您需要查看视图上每个控件的插座,并在 Connections Inspector 中删除旧的。
    • 主保佑你出生和未出生的孩子。
    • 我在这里尝试了很多次。最后我新建了一个View和ViewController来替换旧的,把有问题的删掉,问题就解决了。我也花了太多时间在这个问题上。
    猜你喜欢
    • 2015-03-30
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多