2013-10-17 71 views
0

在將節標題添加到我的應用程序中的某個表之前,我能夠使用commitEditingStyle函數刪除行,而沒有任何問題。我決定實現節標題,以方便用戶查看按日期添加到表中的項目。此功能正常工作。在實現節標題後,我遇到了刪除行的問題,但是感謝來自stackoverflow上好人的幫助,問題得到部分解決。經過一些測試後,我意識到如果行在同一部分中,並且我試圖從部分的首行開始按順序刪除多行,則首行會刪除正常,但嘗試刪除第二行會導致應用程序崩潰。如果我刪除第一行以外的所有行,然後刪除最後一行,它可以正常工作。 Xcode沒有指出它在調試日誌中崩潰的原因。將節標題添加到uitableview後刪除行的問題

下面是的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 reloadData]; 
    } 
} 

回答

0

一些事情在前面。每次你想重新加載tableview時,我都不會發出提取請求。你應該看看NSFetchedResultsController。它會自動將數據綁定到您的tableview,並根據來自相同NSManagedObjectContexts的更新或其他上下文更新的消息進行刷新,併爲您進行批處理。

要回答你的原始問題。我會嘗試先刪除從數組對象,然後刪除該NSManagedObject,然後你可以使用一些掛羊頭賣狗肉的tableview:

NSManagedObject *managedObject = self.array[indexPath.row]; 
[self.array removeObjectAtIndex:indexPath.row]; 
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationAutomatic]; 
[context deleteObject:managedObject]; 

我可能是錯的,但它可能是因爲您無法fullfil故障。希望有所幫助。