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

问题描述:

好的,这是一个我无法弄清的奇怪的错误。我从核心数据实体获取费用。然后我在日期排序这些结果。我使用这个排序的结构来获取正确的数据,以获得tableView中正确的部分和行。此代码全部正常工作,TableView插座中的单元格在cellForRowAtIndexPath中正确填充。但是,当一个单元格退出tableView(=排队),然后再次加载回去(=离队)时,我无法访问费用和它的关系了...... 让我进一步解释:这里的核心数据结构故障 - 核心数据只能在使用UITableView时访问对象一次

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 } 

我获取数据并对其进行排序。这段代码仍然正常工作,所以继续前进。当其对数据结构进行排序时。

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

然后当单元格加载时我想访问expenseHasCat关系。第一次加载表格时一切正常。

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一个无法触发故障或值现在不知何故无...第一次打印是当它加载时,第二次,如果它无法加载。任何人都知道如何从错误中提取数据?

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

我还不找到一个解决方案

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

+0

错误不是问题。这就是核心数据的工作原理,“故障”一词并不意味着有什么问题。请参阅http://*.com/questions/7304257/coredata-error-data-fault/7304350#7304350 – jrturton

+0

这个问题可能在你的相当混乱的字典里面 - 这是一个实际上是一个元组数组,但是确保你需要添加一个异常断点并找出解包失败的行。 – jrturton

+0

每次尝试第二次访问属性时都会启动该错误。 Expense对象的打印输出就像第二个打印语句。我知道故障只是核心数据的内存保存功能。但由于某些原因,在第一次正确访问它之后,它不能再访问它的属性。该对象没有以任何方式修改。我会让代码更具可读性。 –

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

+0

我只是使用重用标识符。我没有tableView.registerClass,因为我认为这会覆盖标识符。我用来获取我的单元格的标识符拼写正确。我添加了更新。这可能与核心数据错误有关? –

+0

它应该是你的tableView的东西,一个单元格是可选的,但它不应该被设置为零,因为它被表格上的前一个单元格重新使用。你也可以看到,如果让我们使用武力展开的话。 – NSGangster

+0

细胞永远不会零。它是我创建的sortedStructure中的Expenses对象。 expenseDictionary中的费用对象的关系为零。我可以继续访问非关系属性。 –

如果从读取请求得到的对象是故障使用

yourFetchRequest.returnsObjectsAsFaults = false; 

禁用它们。

+0

执行后结果是一样的。我第一次可以访问提取的Expense并使用它的属性。第二次尝试访问它时,它给我一个运行时错误。 (EXC_BAD_ACCESS) –