NSFetchedResultsChangeDelete не запускается - PullRequest
3 голосов
/ 30 июля 2010

Кто-нибудь сталкивался с этим раньше?

Когда я выбираю удаление строки из моего tableView (заполненного FRC), приложение не падает или не зависает.Это ничего не делает.Кнопка удаления остается выбранной, и если я нажимаю в другом месте на симуляторе, кнопка удаления отменяется и исчезает, но ячейка никогда не удаляется из пользовательского интерфейса.Я уверен, что я делаю глупый надзор, но не могу его заметить.Ниже приведены соответствующие части моего кода.

У меня есть интерфейс UITableViewController, объявленный так:

#import <UIKit/UIKit.h>
#import "RubricAppDelegate.h"


@interface ClassList : UITableViewController <NSFetchedResultsControllerDelegate> {
    NSMutableArray *classList;
    NSFetchedResultsController *fetchedResultsController;
    NSManagedObjectContext *managedObjectContext;

}

@property(nonatomic,retain) NSMutableArray *classList;
@property(nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property(nonatomic, retain) NSManagedObjectContext *managedObjectContext;

- (IBAction) grade:(id)sender;

@end

В файле его реализации у меня есть:

- (void)viewDidLoad {

    [super viewDidLoad];

    RubricAppDelegate *appDelegate = (RubricAppDelegate *)[[UIApplication sharedApplication] delegate];
    managedObjectContext = [appDelegate managedObjectContext];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"myClass" inManagedObjectContext:managedObjectContext];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"classID" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];


    fetchedResultsController = [[NSFetchedResultsController alloc]
                                           initWithFetchRequest:request 
                                           managedObjectContext:self.managedObjectContext
                                           sectionNameKeyPath:nil cacheName:nil];
    NSError *error;
    [fetchedResultsController performFetch:&error];
}

И

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        myClass *result = (myClass *)[fetchedResultsController objectAtIndexPath:indexPath];
        [managedObjectContext deleteObject:result]; 
            NSError *error;
            [managedObjectContext save:&error]; 
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        //Not yet implemented   
    }   
}

И

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

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:

            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];

            break;

        case NSFetchedResultsChangeDelete:

            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                                 withRowAnimation:UITableViewRowAnimationFade];

            break;

        case NSFetchedResultsChangeUpdate:

            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];

            break;

        case NSFetchedResultsChangeMove:

            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];

            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
                             withRowAnimation:UITableViewRowAnimationFade];

            break;
    }

}

Кроме того

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == [[fetchedResultsController fetchedObjects] count]) {
        return UITableViewCellEditingStyleInsert;
    }
    return UITableViewCellEditingStyleDelete;
}

Этот код выше делает ячейку, расположенную сразу после моих заполненных выборкой ячеек, вставной ячейкой, но остальныеудалить ячейки.

Мой UITableView подключен к владельцу моего файла для его делегата и источника данных в IB.Что мне нужно изменить, чтобы заставить NSFetchedResultsChangeDelete: срабатывать?

ОБНОВЛЕНИЕ:

Я добавил [managedObjectContext save:&error]; к commitEditingStyle и подтвердил через точку останова, что это происходит, когда я выбираюудалить ячейку.Я знаю, что сохранение обрабатывается правильно, потому что, если я закрою и перезапущу приложение, ячейки, которые я выбрал для удаления, на самом деле будут удалены.

Однако, когда я нажимаю кнопку удаления, все равно ничего не появляетсяпроисходит.Кнопка остается выделенной до тех пор, пока я не нажму на что-либо еще, отменив выбор.

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Можете ли вы показать код, который создает NSFetchedResultsController?Теперь, когда у вас есть сохранение в вашем коде, как предложено @DVG, вы должны получать обратные вызовы.Возможно, ваш делегат настроен неправильно.

Обновление

Как я и подозревал, вы не устанавливаете делегата на NSFetchedResultsController:

[fetchedResultsController setDelegate:self];

Вы должны начать получатьобновляется после добавления этой строки вокруг того, где вы звоните -performFetch:.

1 голос
/ 30 июля 2010

Похоже, вам нужно реализовать editStyleForRowAtIndexPath, чтобы фактически объявить ячейки, которые вы пытаетесь удалить, удаляемыми.

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
  return UITableViewCellEditingStyleDelete;
}

Кроме того, не похоже, что вы сохраняете свой managedObjectContext.

EDIT: Похоже, ваша модель коммитует, но ваша таблица перезагружается.

Попробуйте реализовать

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
  [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
  [self.tableView endUpdates];
}
...