I have a UITableView
powered by an NSFetchedResultsController
and am trying to properly support reordering.
Inside moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
I respond to the reordering by updating an order
value on the NSManagedObject
s and save the context like this:
[self.fetchedResultsController.managedObjectContext save:nil];
So now all objects have the correct order
value and the results controller's NSFetchRequest
sorts by that value correctly.
This does appear to work, however when I scroll up and down in the table view, the old values are being displayed. So it looks like when I use objectAtIndexPath
on the NSFetchedResultsController
, it doesn't return the latest object.
- (UITableViewCell *)tableView:(开发者_如何学编程UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// ... cell generation code ...
NSManagedObject *obj = [self.fetchedResultsController objectAtIndexPath:indexPath];
[cell.textLabel setText:sideEffect.name];
}
If I navigate away and then return, the cells are in the correct order.
After my call to save
, do I need to:
- Refresh the
NSFetchedResultsController
- Invalidate a cache
- Refresh/reset something on the
UITableView
?
The solution was to reinitialise the fetch controller after the move modifications had taken place. Since I had a special getter method generating the controller (and performing the first fetch), I could just set the instance variable to nil
to cause it to be regenerated next time it was needed.
精彩评论