swift - SIGABRT with coredata uncaught exception of type NSExeption

标签 swift core-data save swift2 uitextfield

我正在制作一个使用核心数据的应用。我正在尝试制作一个名为 saveButton 的按钮,它将文本保存在几个文本字段中。我的核心数据类是 SecondVCItem,当我点击保存按钮时,应用程序崩溃并出现以下错误:

“2016-03-04 12:26:23.799 OCP[664:12324] Interface Builder 文件中的未知类 _TtC3OCP9ImageView。 2016-03-04 12:26:50.552 OCP[664:12324] CoreData:错误:无法调用 NSManagedObject 类“OCP.SecondVCItem”上的指定初始值设定项 2016-03-04 12:26:50.559 OCP[664:12324] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“在实体中找不到键路径名称” 以 NSException 类型的未捕获异常终止”

奇怪的是,我没有在 Storyboard中两次分配任何东西,也没有坏的导出。我不知道为什么我不能保存这些文本字段。任何信息都是有帮助的。谢谢

import UIKit
import CoreData

class secondViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
{
@IBOutlet var recTextField1: UITextField!
@IBOutlet var recTextField2: UITextField!
@IBOutlet var recTextField3: UITextField!
@IBOutlet var recButton1: UIButton!
@IBOutlet var recButton2: UIButton!
@IBOutlet var recButton3: UIButton!

@IBOutlet var editLocationButtonTapped: UIButton!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var usernameTextField: UITextField!
@IBOutlet var essayNumber: UITextField!
@IBOutlet var letterOrForm: UISegmentedControl!
@IBOutlet var requiredTesting: UITextField!
@IBOutlet var commonApp: UISegmentedControl!
@IBOutlet var imageView: UIImageView!
var imagePicker = UIImagePickerController()

var selectedCollege : Item!

@IBOutlet var locationEditingTextField: UITextField!
@IBOutlet weak var dateTextField: UITextField!
@IBOutlet weak var datePicker: UIDatePicker!


let coreDataDB = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var items = [SecondVCItem]()


override func viewDidLoad()
{
    super.viewDidLoad()

    imagePicker.delegate = self

    dateTextField.enabled = false

    locationEditingTextField.text = selectedCollege.location

    if let collegeImage = selectedCollege.image {
        let collegeImageUI = UIImage(data: collegeImage)
        imageView.image = collegeImageUI
    }

    let request = NSFetchRequest(entityName: "SecondVCItem")
    var results : [AnyObject]?

    do {
        results = try coreDataDB!.executeFetchRequest(request)
    } catch {
        results = nil
    }

    if results != nil {
        self.items = results as! [SecondVCItem]
    }


    navigationItem.title = selectedCollege.name

    locationEditingTextField.enabled = false

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    view.addGestureRecognizer(tap)
}







@IBAction func saveButton(sender: UIButton)
{
    let newItem = SecondVCItem(teacherRec1: recTextField1.text!, teacherRec2: recTextField2.text!, teacherRec3: recTextField3.text!, username: usernameTextField.text!, password: passwordTextField.text!, datepicker: datePicker, datepickertextfield: dateTextField.text!, reqTesting: requiredTesting.text!, numberOfEssays: essayNumber.text!, letterOrForm: letterOrForm.selectedSegmentIndex, commonApp: commonApp.selectedSegmentIndex, image: UIImage(named: "Question"), location: locationEditingTextField.text!, inManagedObjectContext: self.coreDataDB!)

    self.items.append(newItem)

    // CoreData save

    newItem.username = usernameTextField.text!
    newItem.password = passwordTextField.text!
    newItem.teacherRec1 = recTextField1.text!
    newItem.teacherRec2 = recTextField2.text!
    newItem.teacherRec3 = recTextField3.text!
    newItem.reqTesting = requiredTesting.text!
    newItem.numberOfEssays = essayNumber.text!
    newItem.datepickertextfield = dateTextField.text!

    usernameTextField.text! = newItem.username!
    passwordTextField.text! = newItem.password!
    recTextField1.text! = newItem.teacherRec1!
    recTextField2.text! = newItem.teacherRec2!
    recTextField3.text! = newItem.teacherRec3!
    requiredTesting.text! = newItem.reqTesting!
    essayNumber.text! = newItem.numberOfEssays!
    dateTextField.text! = newItem.datepickertextfield!





    newItem.save(self.coreDataDB!)


    // Reload Coredata data
   // self.items = SecondVCItem().fetchAll(self.coreDataDB!)
    self.items = SecondVCItem().fetchAll(self.coreDataDB!)

    // Reload TableView
    //self.collegeTableView.reloadData()


   }

@IBAction func textFieldEditingDate(sender: UITextField)
{
    let datePicker : UIDatePicker = UIDatePicker()
    datePicker.datePickerMode = UIDatePickerMode.Date
    sender.inputView = datePicker
    datePicker.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
}

@IBAction func datePicker(sender: UIDatePicker)
{
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
    dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle

    dateTextField.text = dateFormatter.stringFromDate(sender.date)
}

@IBAction func onTappedTeacherRec(sender: UIButton)
{
    let recAlert = UIAlertController(title: "Add Teacher Recs", message: nil, preferredStyle: UIAlertControllerStyle.Alert)

        recAlert.addTextFieldWithConfigurationHandler { (textField) -> Void in
            textField.placeholder = "Add First Teacher Name"
    }
        recAlert.addTextFieldWithConfigurationHandler { (textField) -> Void in
            textField.placeholder = "Add Second Teacher Name"
    }
        recAlert.addTextFieldWithConfigurationHandler { (textField) -> Void in
            textField.placeholder = "Add Third Teacher Name"
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)
    recAlert.addAction(cancelAction)

    let addAction = UIAlertAction(title: "Add Teachers", style: .Default)
    { (action) -> Void in
        let firstTeacherField = (recAlert.textFields?[0])! as UITextField
        let secondTeacherField = (recAlert.textFields?[1])! as UITextField
        let thirdTeacherField = (recAlert.textFields?[2])! as UITextField

        if firstTeacherField.text == ""
        {
            self.recTextField1.hidden = true
            self.recButton1.hidden = true
        }
        else
        {
            self.recTextField1.hidden = false
            self.recTextField1.text = firstTeacherField.text
            self.recButton1.hidden = false
        }
        if  secondTeacherField.text == ""
        {
            self.recTextField2.hidden = true
            self.recButton2.hidden = true
        }
        else
        {
            self.recTextField2.hidden = false
            self.recTextField2.text = secondTeacherField.text
            self.recButton2.hidden = false
        }
        if thirdTeacherField.text == ""
        {
            self.recTextField3.hidden = true
            self.recTextField3.text = thirdTeacherField.text
            self.recButton3.hidden = true
        }
        else
        {
            self.recTextField3.hidden = false
            self.recTextField3.text = thirdTeacherField.text
            self.recButton3.hidden  = false
        }

        firstTeacherField.text = self.recTextField1.text
        secondTeacherField.text = self.recTextField2.text
        thirdTeacherField.text = self.recTextField3.text
    }

    recAlert.addAction(addAction)
    self.presentViewController(recAlert, animated: true, completion: nil)
}

@IBAction func editRec1(sender: UIButton)
{
    if recTextField1.enabled == false
    {
        recButton1.setTitle("Save", forState: UIControlState.Normal)
        recTextField1.enabled = true
    }
    else
    {
        recTextField1.enabled = false
        recButton1.setTitle("Edit", forState: UIControlState.Normal)
        //selectedCollege.location = recTextField1.text!

    }

}
@IBAction func editRec2(sender: UIButton)
{
    if recTextField2.enabled == false
    {
        recButton2.setTitle("Save", forState: UIControlState.Normal)
        recTextField2.enabled = true
    }
    else
    {
        recTextField2.enabled = false
        recButton2.setTitle("Edit", forState: UIControlState.Normal)
        //selectedCollege.location = recTextField2.text!
    }

}
@IBAction func editRec3(sender: UIButton)
{
    if recTextField3.enabled == false
    {
        recButton3.setTitle("Save", forState: UIControlState.Normal)
        recTextField3.enabled = true
    }
    else
    {
        recTextField3.enabled = false
        recButton3.setTitle("Edit", forState: UIControlState.Normal)
        //selectedCollege.location = recTextField3.text!
    }

}

func dismissKeyboard()
{
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}

@IBAction func editLocationButtonTapped(sender: UIButton)
{
    if locationEditingTextField.enabled == false
    {
        editLocationButtonTapped.setTitle("Save new location", forState: UIControlState.Normal)
        locationEditingTextField.enabled = true
    }
    else
    {
        locationEditingTextField.enabled = false
        editLocationButtonTapped.setTitle("Edit Location", forState: UIControlState.Normal)
        selectedCollege.location = locationEditingTextField.text!

    }
}

@IBAction func editImage(sender: UIButton)
{

    imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    presentViewController(imagePicker, animated: true, completion: nil)

}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    imagePicker.dismissViewControllerAnimated(true, completion:
        {
            let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
            self.imageView.image = selectedImage
        }
    )

}
}

最佳答案

该错误中有几个不同的问题。其中之一是:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'OCP.SecondVCItem'

这是因为您在创建 SecondVCItem 时没有使用指定的初始化程序 (init(entity, insertIntoManagedObjectContext))。查看您的代码,这可能是由于这一行:

self.items = SecondVCItem().fetchAll(self.coreDataDB!)

SecondVCItem() 调用普通初始化程序 (init()) 而不是指定的初始化程序。但我怀疑您实际上希望 fetchAll 成为类方法,而不是实例方法。如果是这样,您将需要使用 class 关键字来定义它:

class func fetchAll(....

然后您可以使用类名不带括号来调用该方法:

self.items = SecondVCItem.fetchAll(self.coreDataDB!)

另一个问题是:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath name not found in entity '

这可能是由这条线引起的:

navigationItem.title = selectedCollege.name

检查Item的实体和类定义;看起来该实体没有 name 属性。

关于swift - SIGABRT with coredata uncaught exception of type NSExeption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35803848/

相关文章:

swift - 如何确保在数据加载之前我不会访问数据?

Eclipse 自动上传保存,没有 Aptana

ios - Swift - NSFetchRequest 错误

ios - 在 Swift 中链接到 iTunes 音乐

ios - 在核心数据 swift ios 中使用未解析的标识符 "Model"

ios - 使用 Coredata 或 NSMutableArray 的 NSPredicate 进行过滤的最佳方法?

ios - UIViewController 内的 UICollectionView 不允许滚动

一个删除线样式中的 Swift 多个标签

iphone - 替换 iPhone/CoreData 中 Unresolved 错误的 aborts()

batch-file - 如何在批处理文件中将vbs保存在多行中的一个命令