2015-11-14 28 views
0

好的,這是一個我無法弄清的奇怪的錯誤。我從核心數據實體獲取費用。然後我在日期排序這些結果。我使用這個排序的結構來獲取正確的數據,以獲得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://stackoverflow.com/questions/7304257/coredata-error-data-fault/7304350#7304350 – jrturton

+0

這個問題可能在你的相當混亂的字典裏面 - 這是一個實際上是一個元組數組,但是確保你需要添加一個異常斷點並找出解包失敗的行。 – jrturton

+0

每次嘗試第二次訪問屬性時都會啓動該錯誤。 Expense對象的打印輸出就像第二個打印語句。我知道故障只是核心數據的內存保存功能。但由於某些原因,在第一次正確訪問它之後,它不能再訪問它的屬性。該對象沒有以任何方式修改。我會讓代碼更具可讀性。 –

回答

0

從字面上看有這個問題,昨天,你怎麼註冊customTableViewCell的類?如果故事板上有重用標識符,則刪除您可能包含在視圖中的tableView.registerClass()行加載。檢查您的身份檢查員,並確保您的故事板上的課程與您的自定義課程相匹配。讓我知道你是如何註冊單元格的。

+0

我只是使用重用標識符。我沒有tableView.registerClass,因爲我認爲這會覆蓋標識符。我用來獲取我的單元格的標識符拼寫正確。我添加了更新。這可能與核心數據錯誤有關? –

+0

它應該是你的tableView的東西,一個單元格是可選的,但它不應該被設置爲零,因爲它被表格上的前一個單元格重新使用。你也可以看到,如果讓我們使用武力展開的話。 – NSGangster

+0

細胞永遠不會零。它是我創建的sortedStructure中的Expenses對象。 expenseDictionary中的費用對象的關係爲零。我可以繼續訪問非關係屬性。 –

0

如果從讀取請求得到的對象是故障使用

yourFetchRequest.returnsObjectsAsFaults = false; 

禁用它們。

+0

執行後結果是一樣的。我第一次可以訪問提取的Expense並使用它的屬性。第二次嘗試訪問它時,它給我一個運行時錯誤。 (EXC_BAD_ACCESS) –