应用程序崩溃,因为 - “类不符合键的键值编码”

Posted

技术标签:

【中文标题】应用程序崩溃,因为 - “类不符合键的键值编码”【英文标题】:App crashes because - "Class is not key value coding-compliant for the key" 【发布时间】:2015-02-19 19:28:48 【问题描述】:

每次我去 VieController3 时我的应用程序都会崩溃,我不知道为什么/如何解决问题。

http://img3.fotos-hochladen.net/uploads/bildschirmfoto6cji4t9fp1.png

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

import UIKit
import CoreData

class ViewController3: UIViewController, UITableViewDataSource 

var people = [NSManagedObject]()

@IBOutlet weak var tableView: UITableView!


func tableView(tableView: UITableView,
    numberOfRowsInSection section: Int) -> Int 
        return people.count


func tableView(tableView: UITableView,
    cellForRowAtIndexPath
    indexPath: NSIndexPath) -> UITableViewCell 

        let cell =
        tableView.dequeueReusableCellWithIdentifier("Cell")
            as UITableViewCell

        let person = people[indexPath.row]
        cell.textLabel!.text = person.valueForKey("name") as String?

        return cell


@IBAction func addExercise(sender: AnyObject) 
    var alert = UIAlertController(title: "New exercise",
        message: "Add a new exercise",
        preferredStyle: .Alert)

    let saveAction = UIAlertAction(title: "Save",
        style: .Default)  (action: UIAlertAction!) -> Void in

            let textField = alert.textFields![0] as UITextField
            self.saveName(textField.text)
            self.tableView.reloadData()
    

    let cancelAction = UIAlertAction(title: "Cancel",
        style: .Default)  (action: UIAlertAction!) -> Void in
    

    alert.addTextFieldWithConfigurationHandler 
        (textField: UITextField!) -> Void in
    

    alert.addAction(saveAction)
    alert.addAction(cancelAction)

    presentViewController(alert,
        animated: true,
        completion: nil)


func saveName(name: String) 
    //1
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate

    let managedContext = appDelegate.managedObjectContext!

    //2
    let entity =  NSEntityDescription.entityForName("Person",
        inManagedObjectContext:
        managedContext)

    let person = NSManagedObject(entity: entity!,
        insertIntoManagedObjectContext:managedContext)

    //3
    person.setValue(name, forKey: "name")

    //4
    var error: NSError?
    if !managedContext.save(&error) 
        println("Could not save \(error), \(error?.userInfo)")
    
    //5
    people.append(person)


override func viewDidLoad() 
    super.viewDidLoad()
    title = "\"Edit your Exercises\""
    tableView.registerClass(UITableViewCell.self,
        forCellReuseIdentifier: "Cell")


override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)

    //1
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate

    let managedContext = appDelegate.managedObjectContext!

    //2
    let fetchRequest = NSFetchRequest(entityName:"Person")

    //3
    var error: NSError?

    let fetchedResults =
    managedContext.executeFetchRequest(fetchRequest,
        error: &error) as [NSManagedObject]?

    if let results = fetchedResults 
        people = results
     else 
        println("Could not fetch \(error), \(error!.userInfo)")
    


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

【问题讨论】:

检查 .xib 或故事板文件中的出口和操作。 检查了两次 - 我创建了一个 Outlet (tableView) 和一个 Action (Button) 并选择 ViewController 作为 tableView 的数据源 为什么在异常信息中省略了类名???当您调用 addExercise 时,这会告诉您真正存在什么类。 你能告诉我如何正确吗? 添加完整的错误信息,不要删除中间的文字或者至少解释你为什么这样做。 【参考方案1】:

最新的截图显示了之前的另一个错误,这可能是导致它下面的错误。

Unknown class ViewController3 in InterfaceBuilder

对我来说,这表明您尝试在 ViewController 上设置一个类,但该类输入错误。您是否创建了一个继承 UIViewController 的类 ViewController3

因此,ViewController 默认使用默认的UIViewController,而UIViewController 没有属性tableView,所以它会崩溃。

希望对您有所帮助。

【讨论】:

以上是关于应用程序崩溃,因为 - “类不符合键的键值编码”的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit 游戏崩溃(因为 SKLightNode 线程问题?)

Tomcat 7 崩溃后无法启动

使用intent和get方法时Android应用程序崩溃

Dart 单元测试应因异常而失败

应用程序崩溃,因为方法正在被释放

在 iPad 中呈现 UIActivityController 时应用程序崩溃