故障 – 核心数据只能在使用UITableView时访问一次对象

好吧,这是一个奇怪的错误,我无法弄清楚。 我从核心数据实体获取费用。 然后我把这些结果sorting。 我使用这个sorting的结构来获取正确的部分和tableView中的行正确的数据。 此代码全部正常工作,并且TableForcts中的单元格在cellForRowAtIndexPath中正确填充。 但是,当一个单元格退出tableView(= queued),然后又被加载回来(= dequeued)时,我不能再访问这个开销和它的关系了…… 让我进一步解释一下:这里的核心数据结构

extension Category { @NSManaged var name: String? @NSManaged var catHasExpenses: NSOrderedSet? } extension Expenses { @NSManaged var amount: NSNumber @NSManaged var name: String? @NSManaged var date: NSDate @NSManaged var expenseHasCat: Category } 

我获取数据并对其进行分类。 此代码仍然正常工作,所以继续前进。 当它对数据结构进行sorting时

 var expensesDictionary = ([(NSDate, Expenses)])() //Array of tuples 

然后,当单元格加载我想访问费用的HasCat关系。 第一次加载表格时,一切正常。

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("expensesCell", forIndexPath: indexPath) as! CustomExpensesTableViewCell let pos = getPositionInDictionary(indexPath.section, row: indexPath.row) // set Category image - imageName = expenseHasCat.name var expense = self.expensesDictionary[pos].1 NSLog("\(expense)") //check printout below cell.expenseCategory.image = UIImage(named: (expense.expenseHasCat.name)! as String); return cell } 

但由于某种原因, 如果单元格退出tableView,并在以后加载回来,我不能再访问费用 。 它说这是零,而解包一个可选。 我不明白为什么会这样。 expenseDictionary根本没有改变。 我只是不明白为什么它会第一次,但不是第二次。

有人关注这里发生的事情吗?

更新! – 错误必须是基本问题…

我只注意到在self.expensesDictionary [pos] .1 中的Expenses对象的打印是无法触发错误,或值现在是零现在…首先打印是当它加载,第二,如果它不能加载。 任何人都知道如何从故障中提取数据?

  <x-coredata://9FBBD46A-CD75-4DAB-A796-5BA945927C9A/Expenses/p23> ; data: { amount = 8; date = "2015-11-14 21:57:51 +0000"; expenseHasCat = "0x7ba6a310 <x-coredata://9FBBD46A-CD75-4DAB-A796-5BA945927C9A/Category/p8>"; name = nil; }) (entity: Expenses; id: 0x7ba71b00 <x-coredata://9FBBD46A-CD75-4DAB-A796-5BA945927C9A/Expenses/p23> ; data: <fault>) 

我还没有find解决办法

这里的线程堆栈: https : //www.dropbox.com/s/zvpvlcsqjpqcxns/Screenshot%202015-11-16%2015.42.09.png?dl = 0

从字面上看,昨天有这个问题,你怎么注册customTableViewCell的类? 如果在故事板上有一个重用标识符,那么删除可能包含在视图中的tableView.registerClass()行。 检查您的身份检查员,并确保您的故事板上的课程匹配您的自定义class级。 让我知道你是如何注册单元格。

如果获取请求产生的对象是故障使用

 yourFetchRequest.returnsObjectsAsFaults = false; 

禁用它们。