2013-10-15 2 views
1

Прежде чем добавлять заголовки разделов к одной из моих таблиц в моем приложении, я смог удалить строки, используя функцию commitEditingStyle. Я решил реализовать заголовки разделов, чтобы облегчить пользователю просмотр элементов, добавленных в таблицу по дате. Я тестировал эту функциональность, и она отлично работает. Но теперь пытается удалить строку вызывает сбой: сбойУдаление строк в виде таблицы с заголовками разделов

Assertion в - [UITableView _endCellAnimationsWithContext:]> /SourceCache/UIKit_Sim/UIKit-2903.2/UITableView.m:1330

Я новый для разработки obj-c и не хотел добавлять разделы, так как я знал, что это добавит сложности в код, и мне потребовалось некоторое время, чтобы понять это. Но я думаю, что так вы учитесь.

Вот код для функции cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    AgendaCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[AgendaCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:CellIdentifier]; 
    } 
    NSString *strDate = [dateArray objectAtIndex:indexPath.section]; 
    NSMutableArray *dateSection = [tempDict objectForKey:strDate]; 

    NSManagedObject *object = [dateSection objectAtIndex:indexPath.row]; 
    cell.sessionNameLabel.text = [object valueForKey:@"sessionname"]; 
    cell.sessionNameLabel.textColor = [UIColor blueColor]; 
    cell.sessionDateLabel.text = [object valueForKey:@"sessiondate"]; 
    cell.sessionDateLabel.textColor = [UIColor brownColor]; 
    cell.sessionTimeLabel.text = [object valueForKey:@"sessiontime"]; 
    cell.sessionTimeLabel.textColor = [UIColor brownColor]; 

    return cell; 

} 

Вот код для моей функции таблицы обновления:

- (void) refreshTable 
    { 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sessnotes" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"agenda == 'Yes'"]]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sessiondate" ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 

     [self.refreshControl endRefreshing]; 
     self.objects = results; 

    if (results.count == 0) { 
     NSString *message = @"You have not added any sessions to your planner."; 
     UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Notification" 
                 message:message 
                 delegate:self 
              cancelButtonTitle:@"Ok" 
              otherButtonTitles:nil,nil]; 
     [alertView show]; 
    } 
    else if (results.count > 0){ 
    tempDict = nil; 
    tempDict = [[NSMutableDictionary alloc] init]; 

    NSString *strPrevDate= [[results objectAtIndex:0] valueForKey:@"sessiondate"]; 
    NSLog(@"strPrevDate value is: %@", strPrevDate); 
    NSString *strCurrDate = nil; 
    NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
    //Add the Similar Date data in An Array then add this array to Dictionary 
    //With date name as a Key. It helps to easily create section in table. 
    for(int i=0; i< [results count]; i++) 
    { 
     strCurrDate = [[results objectAtIndex:i] valueForKey:@"sessiondate"]; 

     if ([strCurrDate isEqualToString:strPrevDate]) 
     { 
      [tempArray addObject:[results objectAtIndex:i]]; 
     } 
     else 
     { 
      [tempDict setValue:[tempArray copy] forKey:strPrevDate]; 

      strPrevDate = strCurrDate; 
      [tempArray removeAllObjects]; 
      [tempArray addObject:[results objectAtIndex:i]]; 
     } 
    } 
    //Set the last date array in dictionary 
    [tempDict setValue:[tempArray copy] forKey:strPrevDate]; 

    NSArray *tArray = [tempDict allKeys]; 
    //Sort the array in ascending order 
    dateArray = [tArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    } 

     [self.tableView reloadData]; 

} 

Вот код для функции commitEditingStyle:

- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     //add code here for when you hit delete 

     NSManagedObject *object = [self.objects objectAtIndex:indexPath.row]; 

     NSManagedObjectContext *context = [self managedObjectContext]; 

     [context deleteObject:[context objectWithID:[object objectID]]]; 

     NSError *error = nil; 
     // Save the object to persistent store 
     if (![context save:&error]) { 
      NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
     } 

     NSMutableArray *array = [self.objects mutableCopy]; 
     [array removeObjectAtIndex:indexPath.row]; 
     self.objects = array; 
     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
} 
+1

Можете ли вы предоставить некоторые больше информации о сбоях? – paulrehkugler

+0

Если вы используете Core Data, вам действительно нужно использовать NSFetchedResultsController. Взгляните на это ... http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller – Fogmeister

ответ

-1
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
//replace with it: 
[tableView reloadData]; 
+1

Или немного меньше ядерной опции (более локализованная анимация) ' [tableView reloadSections: [NSIndexSet indexSetWithIndex: indexPath.section] withRowAnimation: UITableViewRowAnimationAutomatic] ' –

+0

Спасибо. Таким образом, это работает при удалении строк с разными разделами заголовка (хотя разделы заголовка остаются до тех пор, пока я не обновляю таблицу, тогда они не отображаются). Однако, если строки находятся в одном разделе, и я пытаюсь удалить несколько строк в последовательности, начиная с верхней строки в этом разделе, верхняя строка удаляет штраф, но пытается удалить вторую строку, что приведет к сбою приложения. Если я удалю все строки в последовательности, отличной от первой строки, а затем удалю первую строку последней, она отлично работает. Любая помощь в этом? – bachma0507

+0

Это разрешило крушение и беспорядок, но мне пришлось отказаться от приятной анимации вставки/удаления, так что все еще ищут лучшее решение. –

Смежные вопросы