2012-01-17 13 views
0

私は行を削除するオプションをユーザに提供するために、私のUITableView次のような方法を追加しました:私はオプションUITableViewから行を追加した後に、どのように削除できますか?

使用してXCodeのテンプレートからこのメソッドをコピーした

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

ユーザーは、彼が知らせ入るべき場所に新しいUIViewが開かれUITableViewaddButtonをプッシュするとストレージ

ためCoreData新しいエンティティのためのation。

次に、ユーザーはUIViewsaveButtonに触れます。情報は読み出され、コンテキスト内に格納されます。 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(); 
     } 
    } 
} 

私は行が追加が、コミットされなかったと思います。そして、それは知らない行を削除しようとします。私はこれを正しく理解していますか? しかし、どこでエラーを修正するのか正確にはわかりません。 どうすればいいですか?誰か知っていますか?

+0

私は、あなたが何を意味するかを教えてくれる言葉をいくつか追加しなければならないと思います。私はそれのいくつかを理解していない。 –

+0

写真は常に役立ちます。おそらくそれはもっと明白だろう。 :) –

+0

あなたは私が投稿するエラーを理解していますか? どのように私は問題をクリア...あなたが知りたいのですか? –

答えて

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 Templateにはこのメソッドが含まれています。 私のコードでは、これらの方法もあります。 エラーはcontrollerDidChangeContent:(NSFetchedResultsController *)コントローラから来ていると思います。私はそこで正しいのでしょうか? –

+0

'controllerDidChangeContent:'の呼び出しが正しいです。エラーメッセージには、最終チェックが行われる場所に表示されるだけです。あなたの 'tableView:numberOfRowsInSection'とは何ですか? – Mundi

+0

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)セクション { //セクション内の行数を返します。 id sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; 戻り値[sectionInfo numberOfObjects]; } –

関連する問題