Задать вопрос
@ermolushka

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

Использую в проекте Core Data. Про попытке вставки нового элемента в таблицу, получаю ошибку:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableView.m:1377
2015-01-16 22:45:47.172 LinguaCard[26439:599761] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert row 3 into section 0, but there are only 2 rows in section 0 after the update'


На StackOverflow есть ответы, но ничего дельного не нашел.

CardsTableViewController.m

#import "CardsTableViewController.h"
#import "Lesson.h"
#import "Card.h"
#import "CoreDataHelper.h"

@interface CardsTableViewController ()

@property (strong, nonatomic) NSMutableArray *cards;

@end

@implementation CardsTableViewController

-(NSMutableArray *)cards{
    if (!_cards)
        _cards = [[NSMutableArray alloc] init];
    return _cards;
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSSet *unordereCards = self.lesson.cards;
    NSSortDescriptor *nameDescr = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    NSArray *sortedCards = [unordereCards sortedArrayUsingDescriptors:@[nameDescr]];
    self.cards = [sortedCards mutableCopy];
    
}

#pragma mark - helpers
-(Card *)cardWithName:(NSString *)name{
    
    NSManagedObjectContext *context = [CoreDataHelper managedObjectContext];
    
    Card *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:[CoreDataHelper managedObjectContext]];
    card.name = name;
    card.lesson = self.lesson;
    
    
    NSError *error = nil;
    if (![context save:&error]){
        //we have an error
        NSLog(@"error: %@", error);
    }
    return card;
}


#pragma mark - UIAlertViewDelegate

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

    if (buttonIndex == 1) {
        NSString *alertText = [alertView textFieldAtIndex:0].text;
        [self.cards addObject:[self cardWithName:alertText]];
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:[self.cards count]-1 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
        
    }

}



-(void)viewWillAppear:(BOOL)animated{
    
    [super viewWillAppear:animated];
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Card"];
   
    NSError *error = nil;
    NSArray *fetchedCards = [[CoreDataHelper managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    
    self.cards = [fetchedCards mutableCopy];
    
    [self.tableView reloadData];
}


- (IBAction)addCard:(id)sender {
    
    UIAlertView *newCard = [[UIAlertView alloc] initWithTitle:@"Enter new card name:" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];
    
    [newCard setAlertViewStyle:UIAlertViewStylePlainTextInput];
    [newCard show];
}


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.lesson.cards.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Card Cell" forIndexPath:indexPath];
    
    Card *selectedCard = self.cards[indexPath.row];
    cell.textLabel.text = selectedCard.name;
    return cell;
}
  • Вопрос задан
  • 3555 просмотров
Подписаться 1 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 1
Flanker_4
@Flanker_4
У Вас там что-то несусветное написано...
Но проблема конкретно в

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.lesson.cards.count;
}

Тут нужно написать self.cards.count

После вызова
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:[self.cards count]-1 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
Количество ячеек должно совпадать с тем, что возвращается в методе datasouce. Иначе произойдет падение. А у вас же вставка идет в cards(их станет ну там 3), а в дата соурсе возвращается количество из self.lesson.cards (которых так и останется 2)
Но при этом в саму таблицу ячейку уже впихнули через insertRow - 2!=3 - вот и падает
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы