故障 - 核心数据只能在使用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
从字面上看有这个问题,昨天,你怎么注册customTableViewCell的类?如果故事板上有重用标识符,则删除您可能包含在视图中的tableView.registerClass()
行加载。检查您的身份检查员,并确保您的故事板上的课程与您的自定义课程相匹配。让我知道你是如何注册单元格的。
我只是使用重用标识符。我没有tableView.registerClass,因为我认为这会覆盖标识符。我用来获取我的单元格的标识符拼写正确。我添加了更新。这可能与核心数据错误有关? –
它应该是你的tableView的东西,一个单元格是可选的,但它不应该被设置为零,因为它被表格上的前一个单元格重新使用。你也可以看到,如果让我们使用武力展开的话。 – NSGangster
细胞永远不会零。它是我创建的sortedStructure中的Expenses对象。 expenseDictionary中的费用对象的关系为零。我可以继续访问非关系属性。 –
如果从读取请求得到的对象是故障使用
yourFetchRequest.returnsObjectsAsFaults = false;
禁用它们。
执行后结果是一样的。我第一次可以访问提取的Expense并使用它的属性。第二次尝试访问它时,它给我一个运行时错误。 (EXC_BAD_ACCESS) –
错误不是问题。这就是核心数据的工作原理,“故障”一词并不意味着有什么问题。请参阅http://*.com/questions/7304257/coredata-error-data-fault/7304350#7304350 – jrturton
这个问题可能在你的相当混乱的字典里面 - 这是一个实际上是一个元组数组,但是确保你需要添加一个异常断点并找出解包失败的行。 – jrturton
每次尝试第二次访问属性时都会启动该错误。 Expense对象的打印输出就像第二个打印语句。我知道故障只是核心数据的内存保存功能。但由于某些原因,在第一次正确访问它之后,它不能再访问它的属性。该对象没有以任何方式修改。我会让代码更具可读性。 –