2015-12-21 37 views
0

這是我所有的NSFetchedResultsControllerDelegateEXC_BAD_ACCESS:在line tableView.endUpdates()

//MARK: - NSFetchedResultsControllerDelegate 

func controllerWillChangeContent(controller: NSFetchedResultsController) { 
    self.tableView.beginUpdates() 
} 

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 

    switch type { 
    case .Insert: 
     if let newIndexPath = newIndexPath { 
      tableView.insertRowsAtIndexPaths([reversedIndexPathForIndexPath(newIndexPath)], withRowAnimation: .Fade) 
     } 
    case .Delete: 
     if let indexPath = indexPath { 
      tableView.deleteRowsAtIndexPaths([reversedIndexPathForIndexPath(indexPath)], withRowAnimation: .Fade) 
     } 
    case .Update: 
     if let indexPath = indexPath { 
      if let cell = tableView.cellForRowAtIndexPath(reversedIndexPathForIndexPath(indexPath)) as? WLCommentTableViewCell { 
       updateCell(cell, withIndexPath: indexPath) 
      } 
     } 
    case .Move: 
     if let indexPath = indexPath, let newIndexPath = newIndexPath { 
      tableView.deleteRowsAtIndexPaths([reversedIndexPathForIndexPath(indexPath)], withRowAnimation: .Fade) 
      tableView.insertRowsAtIndexPaths([reversedIndexPathForIndexPath(newIndexPath)], withRowAnimation: .Fade) 
     } 
    } 
} 

func controllerDidChangeContent(controller: NSFetchedResultsController) { 

    tableView.endUpdates() //Thread 1: EXC_BAD_ACCESS (code=1, address=0x20) 
    updateView() 

    if shouldScrollTableToBottom { 
     scrollTableViewToBottom() 
    } 
} 

有時我的應用程序在與tableView.endUpdates()行崩潰。爲什麼?

+0

你確定你的數據源的數量,我的意思是更新前和更新後的行數是相同的。請檢查一下,這可能會有所幫助。 – Sabby

+0

我很肯定他們是一樣的:)我關注這個 –

回答

1

tableView.endUpdates() //Thread 1: EXC_BAD_ACCESS (code=1, address=0x20) 

應該通知您的所有更改NSFetchresultsController委託方法內完成:

controllerDidChangeContent:通知接收器獲取的成果控制器完成的處理 的一個或多個更改添加,刪除,移動或更新。

func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    updateView() 

    if shouldScrollTableToBottom { 
     scrollTableViewToBottom() 
    } 
    tableView.endUpdates() // Mark here no more updates to the tableview 
} 

endUpdates:圓滿結束一系列方法調用插入,刪除,選擇或重新加載該表視圖的行和段。 您可以調用此方法以包圍以beginUpdates開頭的一系列方法調用,該方法調用由插入,刪除,選擇和重新加載表視圖的行和部分的操作組成。當您調用endUpdates時,UITableView將同時爲這些操作提供動畫。 beginUpdates和endUpdates的調用可以嵌套。 如果您不在該塊內進行插入,刪除和選擇調用,則表格屬性(如行計數)可能會變爲無效

+0

那麼,我的代碼有什麼問題? –

+0

將endUpdates想象成一種轉換完成方法:在設置插入,移動或刪除單元格時調用它。 –