iOS:Swift:核心数据:错误:+ entityForName:nil不是用于搜索实体名称的合法NSManagedObjectContext参数 [英] iOS: Swift: Core Data: Error: +entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name

查看:203
本文介绍了iOS:Swift:核心数据:错误:+ entityForName:nil不是用于搜索实体名称的合法NSManagedObjectContext参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Swift语言的表视图中使用了Core Data。它可以成功启动,但是在AddView中单击完成按钮后,会出现错误:

I used Core Data for a table view with Swift Language. It can launch successfully, but after clicking Done button in AddView, there is an error:

由于未捕获的异常'NSInvalidArgumentException',正在终止应用程序,原因:'+ entityForName:nil不是搜索实体名称 OneItemCD的合法NSManagedObjectContext参数。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'OneItemCD''

我不知道为什么。有人可以帮我解决吗?非常感谢!

I don't know why. Could anybody help me figure it out? Thanks very much!

这里是代码。有一个添加栏按钮项。单击此按钮将传输到AddViewController。在文本视图中键入内容并单击完成按钮后,转移回TableViewController。

Here is the code. There is an add bar button item. Clicking this button transfer to AddViewController. After typing something in the text view and clicking Done button, transfer back to 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中:

I put my entire code in github:

https://github.com/snowffer/testTableViewForCoreData

推荐答案

设置 var fetchedResultsController 时,您的 managedObjectContext 仍然 nil 。因此,在声明时,您的应用程序崩溃:

When you set var fetchedResultsController, your managedObjectContext is still nil. Therefore, your app crashes when you declare:

let entity = NSEntityDescription.entityForName("OneItemCD", inManagedObjectContext: self.managedObjectContext)

请务必先正确设置 managedObjectContext 调用上一行代码。

Make sure to set managedObjectContext correctly before you call the previous line of code.

还有一件事

要使用 OneItemCD 的Swift子类与您的Core Data模型一起,在模型实体检查器的类字段中为类名加上模块名称,就像这样: testTableViewCoreData .OneItemCD(请参阅​​有关核心数据和名称空间的更多信息此处)。

To use a Swift subclass of OneItemCD with your Core Data model, prefix the class name in the Class field of the model entity inspector with the name of your module, just like this: "testTableViewCoreData.OneItemCD" (See more about Core Data and namespaces here).

这篇关于iOS:Swift:核心数据:错误:+ entityForName:nil不是用于搜索实体名称的合法NSManagedObjectContext参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆