2012-01-17 82 views
0

我已經添加到我的UITableView下面的方法來提供該選項的用戶刪除線:如何在添加後從UITableView中刪除一行?

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

我抄從Xcode的模板,這種方法與選項

使用CoreData用於存儲

一旦用戶按下在UITableViewUIView被打開,他應該進入通知addButton爲新的實體提供服務。

然後用戶觸摸UIView中的saveButton。信息被讀取並存儲在上下文中。 UIView已關閉,用戶將回到UITableView

新條目現在出現在新行中。如果用戶現在意識到他犯了一個錯誤,並且想要立即刪除該行(從左向右擦,然後觸摸「刪除」),該行將保持不變,並且不會發生任何其他事情。下面的錯誤是給我的:

An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. 
Invalid update: invalid number of rows in section 0. 
The number of rows contained in an existing section after the update (1) 
must be equal to the number of rows contained in that section before the update (1), 
plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted). 
with userInfo (null) 

但刪除行工作,如果我在刪除發生之前退出應用程序。 (並重新查看,然後刪除)

controllerDidChangecontent只有[self.tableView endUpdate]被調用。

我的方法是這樣的:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the managed object for the given index path 
     NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
     [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 

     //NSLog(@"DATE: %@", [[UIApplication sharedApplication] scheduledLocalNotifications]); 


     for (UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications]) { 

      NSLog(@"N: %@", notification.fireDate); 
      NSLog(@"O: %@", [[self.fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"zeit"]); 

      if (notification.fireDate == [[self.fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"zeit"]) { 
       [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
       NSLog(@"GELÖSCHT!"); 
      } 
     } 

     // Save the context. 
     NSError *error = nil; 
     if (![context save:&error]) { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 

我想加入該行,但不COMMITED。然後它會嘗試刪除一個不知道的行。我是否理解正確? 但我不知道在哪裏修復錯誤。 我能做什麼?有人知道嗎?

+0

我想你必須添加一些詞來告訴我們你的意思。我不明白其中的一些。 – 2012-01-17 20:31:06

+0

圖片總是有幫助的。也許那會更清楚。 :) – 2012-01-17 20:31:39

+0

您瞭解我發佈的錯誤? 我如何解決問題......你想知道什麼? – 2012-01-17 20:46:55

回答

2

看看錯誤信息:你的也必須從表格視圖中刪除該行。

如果您使用的是NSFetchedResultsController,你可以做這樣的:

// in controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 
case NSFetchedResultsChangeDelete: 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
break; 

還注意到自己的fetchedResultsController已被告知,它應該重新獲取一個新的結果集 - 否則tableView:numberOfRowsInSection將返回舊的價值。所以你需要插入:

self.fetchedResultsController = nil; 

它會自動重新創建與正確的部分和行。

+0

是的,沒關係。但是XCode模板包含這種方法。 在我的代碼中也有這些方法,你的意思是... 我認爲錯誤來自controllerDidChangeContent:(NSFetchedResultsController *)控制器。我在那裏糾正? – 2012-01-17 21:15:09

+0

'controllerDidChangeContent:'中的調用是正確的。這只是顯示在錯誤消息中,因爲這是最終檢查發生的地方。你的'tableView:numberOfRowsInSection'說什麼? – Mundi 2012-01-17 21:29:41

+0

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //返回節中的行數。 id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; return [sectionInfo numberOfObjects]; } – 2012-01-17 21:32:10

相關問題