我有一个Swift
应用,我尝试使用NSFetchedResultsController
填充四个单独的tableviews
,它们位于主VC
内的容器中,使用从父自定义tableview
控制器类继承。我有一个定义了这个方法的父类,我的所有子类都是继承的:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
var task = fetchedResultsController.objectAtIndexPath(indexPath) as Task
if task.isKindOfClass(Task) == true {
cell.detailTextLabel?.text = task.name//EXC_BAD_ACCESS code=1
}
return cell
}
我评论了它给我EXC_BAD_ACCESS
编译错误的行。
我知道从Task
继承的NSManagedObject
类对象成功存储在该变量中,但似乎每当我尝试访问name属性时(偶数println
都会导致错误),或者对象的任何属性我得到这个编译错误。
我的预感是它与四个不同的tableviews
同时尝试所有访问权限有关。我是Core Data
的新手并不确定。
修改
可能有助于解决问题的更多代码:
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
var fetchedResultsController: NSFetchedResultsController = NSFetchedResultsController()
func getFetchedResultsController() -> NSFetchedResultsController {
fetchedResultsController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
return fetchedResultsController
}
func taskFetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "Task")
let sortDescriptor = NSSortDescriptor(key: "priority", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
override func viewDidLoad() {
super.viewDidLoad()
fetchedResultsController = getFetchedResultsController()
fetchedResultsController.delegate = self
fetchedResultsController.performFetch(nil)
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
实体检查器的屏幕截图:
答案 0 :(得分:0)
搞定了!一些事情:我的name
属性为nil
,因为我没有在模型检查器中设置默认值,并且需要默认值好的方法,但更重要的是:我的managedObjectContext
在声明中没有用!
打开,所以我没有在每次引用时解开它,所以有时我得到了可选({{ 1}})当我需要未包装的值时。那是managedObjectContext?
但它需要的是let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
。可选的问题,并没有充分意识到什么时候打开包装是我的垮台。我还删除了我的初始版let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
,因为在我更改了将默认值分配给app.sqlite
的模型后,我遇到了一个问题。