2017-01-16 69 views
0

我有一個NSFetchedResultsController與tableView鏈接,所以我使用NSFetchedResultsController委託來更新更改。NSFetchedResultsController委託奇怪的行爲

在(controllerWillChangeContent :)我儘量對象的索引存儲在NSFetchedResultsController這樣的:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 

    NSLog(@"controllerWillChangeContent1"); 

    _indexesArray = [[NSMutableArray alloc] init]; 

    for (myObject* my_obj in [controller fetchedObjects]) { 

     NSLog(@"name : %@ row : %d section : %d", my_obj.name, [controller indexPathForObject:my_obj].row, [controller indexPathForObject:my_obj].section); 

     NSIndexPath* idxPath = [controller indexPathForObject:my_obj]; 

     NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; 
     [dict setObject:my_obj.name forKey:@"name"]; 
     [dict setObject:idxPath forKey:@"index"];//it crashes on the deleted element 
     [_indexesArray addObject:dict]; 

    } 

    NSLog(@"controllerWillChangeContent2"); 

} 

我知道,我有一個已刪除項目。我可以遍歷對象(myObject)並讀取名稱,但是它爲刪除的對象提供了一個無索引路徑。

應該NSFetchedResultsController保持在(controllerWillChangeContent :)對象的指標

感謝的

+1

有蘋果爲例,介紹如何使用'NSFetchedResultsController'用'UITableView'在'NSFetchedResultsControllerDelegate'參考 –

+0

謝謝您回覆,但我存儲的NSFetchedResultsController對象的更新之前,爲另一個目的更新 和controllerWillChangeContent不應更新NSFetchedResultsController已作爲蘋果文檔 – zizoodiesel

回答

1

在WillChange中,fetchedresultscontroller犯規知道索引更新的項目會還沒有。爲什麼你有兩個地方,你的控制器實際上知道的對象索引這就是:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
+0

感謝您的迴應 這就是我真正想要的,我想存儲舊索引的NSFetchedResultsController在更新之前,但似乎索引已經在WillChange中消失了,因爲t他刪除元素在WillChange中已經沒有索引,儘管它已經存在,我可以打印它的名字(但索引爲零)。 – zizoodiesel

+0

@zizoodiesel最簡單的做法是避免讓fetchedresultscontroller更新你的tableview,你所做的只是將變化添加到上面提到的兩個不同的MutableArrays中,一個用於「itemChanges」,另一個用於「sectionChanges 「,最後在」controllerDidChangeContent「中手動執行你獲得的sectionChanges和Arraychanges的更新。這樣你就可以100%控制什麼變化和什麼不是:) – 2017-01-17 11:56:54

+0

這正是我需要存儲舊索引的原因,因爲在(controllerDidChangeContent :)我設置了一個限制到這樣的控制器 controller.fetchRequest .fetchLimit = 50;然後嘗試從tableView中刪除舊的索引,通過將它們的舊索引添加到WillChange中,將它們存儲到MutableArrays中itemChanges和sectionChanges 這是一個非常複雜的任務:) 如果我只找到另一個解決方案來做到這一點 – zizoodiesel