2016-03-04 34 views
1

我正在制作一个使用核心数据的应用程序。我试图制作一个名为saveButton的按钮,它将文本保存在几个文本框中。我的核心数据类是SecondVCItem,当我点击保存按钮时,应用程序崩溃,出现以下错误:SIGCART与coredata未捕获类型NSExeption的异常

“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”,原因是: “的keyPath名未找到实体”型NSException”的未捕获的异常终止

奇怪的是,我没有做任何事情分配两次在故事板和没有不好的网点。我不知道为什么我不能保存这些文本字段。任何信息都是有用的。谢谢

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 
     } 
    ) 

} 
} 

回答

1

这个错误有几个单独的问题。其中之一是:

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

这是因为你不使用指定的初始化器(init(entity, insertIntoManagedObjectContext))创建SecondVCItem。通过您的代码来看,这可能是由于这一行:

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

SecondVCItem()调用平原初始化器(init()),而不是指定的初始化器。但我怀疑你实际上想fetchAll是一个类方法,而不是一个实例方法。如果是这样,你需要与class关键字把它定义为这样的:

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

的另一个问题是:

class func fetchAll(.... 

然后,你可以通过使用类名没有括号调用方法这样的:

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

这可能是由这一行造成的:

navigationItem.title = selectedCollege.name 

检查Item的实体和类定义;它会出现该实体没有name属性。