我使用Core Data作为Swift语言的表格视图 . 它可以成功启动,但在AddView中单击完成按钮后,出现错误:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'entityForName:nil不是合法的NSManagedObjectContext参数,用于搜索实体名称'OneItemCD''
我不知道为什么 . 有人能帮帮我搞清楚吗?非常感谢!
这是代码 . 有一个添加栏按钮项 . 单击此按钮将转移到AddViewController . 在文本视图中键入内容并单击“完成”按钮后,转移回TableViewController .
TableViewController:
import UIKit
import CoreData
class TableViewController: UITableViewController, NSFetchedResultsControllerDelegate {
var managedObjectContext: NSManagedObjectContext? = nil
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
return 1
}
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return 0
}
@IBAction func unwindToList(segue: UIStoryboardSegue) {
var source: AddViewController = segue.sourceViewController as AddViewController
source.managedObjectContext = self.managedObjectContext
var noteContent: String? = source.contentBody.text
if noteContent != nil {
let context = self.fetchedResultsController.managedObjectContext
let entity = self.fetchedResultsController.fetchRequest.entity
let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name, inManagedObjectContext: context) as NSManagedObject
newManagedObject.setValue(noteContent, forKey: "content")
var error: NSError? = nil
if !context.save(&error) {
abort()
}
self.tableView.reloadData()
}
}
// MARK: - Fetched results controller
var fetchedResultsController: NSFetchedResultsController {
if _fetchedResultsController != nil {
return _fetchedResultsController!
}
let fetchRequest = NSFetchRequest()
// Edit the entity name as appropriate.
let entity = NSEntityDescription.entityForName("OneItemCD", inManagedObjectContext: self.managedObjectContext)
fetchRequest.entity = entity
// Set the batch size to a suitable number.
fetchRequest.fetchBatchSize = 20
// Edit the sort key as appropriate.
let sortDescriptor = NSSortDescriptor(key: "content", ascending: false)
let sortDescriptors = [sortDescriptor]
fetchRequest.sortDescriptors = [sortDescriptor]
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: "Master")
aFetchedResultsController.delegate = self
_fetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !_fetchedResultsController!.performFetch(&error) {
abort()
}
return _fetchedResultsController!
}
var _fetchedResultsController: NSFetchedResultsController? = nil
}
AddViewController:
import UIKit
import CoreData
class AddViewController: UIViewController {
@IBOutlet weak var contentBody: UITextView!
var managedObjectContext: NSManagedObjectContext? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我把我的整个代码放在github中:
1 回答
设置
var fetchedResultsController
时,managedObjectContext
仍为nil
. 因此,当您声明时,您的应用会崩溃:在调用上一行代码之前,请确保正确设置
managedObjectContext
.One more thing :
要将
OneItemCD
的Swift子类与Core Data模型一起使用,请在模型实体检查器的Class字段中使用模块名称作为类名的前缀,如下所示:"testTableViewCoreData.OneItemCD"(查看有关Core Data和名称空间here的更多信息) .