1

UITableViewコアデータとによってセルが入力されているがありますNSFetchedResultsController。カスタムセルにカスタムボタンがあり、セルの削除に使用する予定です。標準のスワイプして削除するのは非常に簡単ですが、このカスタムボタンを使用したいと思います。データモデルからエントリを削除し、セルを削除するアクションをボタンにフックする方法を知っている人はいますUITableViewか?私の人生のためにこれに対する良い解決策を見つけることができません。

編集:

これは、標準のスワイプして削除することで削除する必要のあるコードです。ボタンで動作するように変更する方法はありますか?

if (editingStyle == UITableViewCellEditingStyleDelete) {

    [self.tableView beginUpdates];

    // Delete the task 
    Task *taskToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"Deleting (%@)", taskToDelete.name);
    [self.managedObjectContext deleteObject:taskToDelete];
    [self.managedObjectContext save:nil];

    // Delete the row 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    [self performFetch];

    [self.tableView endUpdates];
}
4

1 に答える 1

7

総括:

  1. ボタンをコントローラーのアクションに接続しますdeleteRow:(id)sender;
  2. senderボタンになります。UITableViewCellへの参照が得られるまで、そのスーパービューを取得し、次にそのスーパービューのスーパービューを取得します。(を使用してループで検索しisKindOfClass:ます。ボタンが1、2、3レベル下にあると想定しないでください。)
  3. テーブルビューのindexPathForCell:メソッドを呼び出して、セル参照をインデックスパスに変換します。
  4. objectAtIndexPath:フェッチされた結果コントローラーで使用して、オブジェクトを取得します。

それからそれを削除してください!NSFetchedResultsControllerデリゲートメソッドを処理している場合は、削除された行の削除を処理します。

サンプルコード(チェックするためにコンパイラなしで入力):

- (void)deleteRow:(id)sender
{
    id view = [sender superview];
    while (view && ![view isKindOfClass:[UITableViewCell class]]) {
        view = [view superview];
    }
    UITableViewCell *cell = view;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    NSManagedObject *task = [fetchedResultsController objectAtIndexPath:indexPath];
    [self.managedObjectContext deleteObject:task];
    [self.managedObjectContext save:nil];
}

それでおしまい。テーブルビューから行を削除しようとしないでください。オブジェクトが削除されると、NSFetchedResultsControllerのドキュメントで説明されているようにデリゲートメソッドを設定したと仮定して、NSFetchedResultsControllerが変更を検出し、テーブルビューを更新します。まだ読んでいない場合は、ドキュメントをお読みください(オプション-Xcodeの「NSFetchedResultsController」をダブルクリックします)。

于 2012-06-14T06:34:11.613 に答える