0

NSFetchrequestController を使用して、テーブルビューをコアデータで更新しています。行/セクションを削除すると、一時的に状態を削除し、タグでWebサービスに送信するようにしました。

subtask.status = DELETED; //status = 4;

完全な方法はこちらです。

MainTableViewCell *cell = (MainTableViewCell*)btn.superview.superview;
self.selectedIndexPath = [self.tableView indexPathForCell:cell];

Task *tobeUpdatedTask;
[popover dismissPopoverAnimated:YES];

if (btn.titleLabel.tag == 8) { //Deleting Main Task/Section
    NSUInteger index = [self.sectionViewIndexMapping indexOfObject:btn.superview];
    if (index == NSNotFound){
        [self showAlert:@"Error Occured! Unable to find index of the section. Please go back to refresh data." WithTitle:ALERT];
        [self.tableView reloadData];
        [self.roundedButtonMenu removeFromSuperview];
        return;
    }
    if ([[self.krFetchedResultsController sections] count] <= index) {
        [self showAlert:@"Error Occured! Unable to find index of the section. Please go back to refresh data." WithTitle:ALERT];
        [self.tableView reloadData];
        [self.roundedButtonMenu removeFromSuperview];
        return;
    }
    id <KRFetchedResultsSectionInfo> si = [[self.krFetchedResultsController sections] objectAtIndex:index];

    Task *task = (Task *)si.theManagedObject;
    tobeUpdatedTask = task;
    if ([task.status isEqualToString:NEW]) {
        //[self.tableView beginUpdates];
        [self.managedObjectContext  deleteObject:si.theManagedObject];
    }else {
        task.status = DELETED;
        for (SubTask *st in task.subTasks) {
            st.status = DELETED;
        }
    }

}else { //Delete SubTask

    //FIXME: deleting countinously will kill the app. dismissing popover might work.
    if (self.selectedIndexPath == NULL) {
        NSLog(@"Unable to find index subtask object. Oops");
        return;
    }

    SubTask *subtask = [self.krFetchedResultsController objectAtIndexPath:self.selectedIndexPath];
    tobeUpdatedTask = subtask.section;

    if ([subtask.status isEqualToString:NEW]) {
        [self.managedObjectContext deleteObject:[self.krFetchedResultsController objectAtIndexPath:self.selectedIndexPath]];
    }else{
        subtask.status = DELETED;
        subtask.section.status = EDITED;
    }
}

//Remove rounded-menu if exists
[self.roundedButtonMenu removeFromSuperview];
[self.overlayView removeFromSuperview];

[self refreshDatesAndPercentage:tobeUpdatedTask];
[self save];
[self createGanttViewData:nil];
[self.tableView reloadData];

Web サービスの応答によると、以下のコード スニペットのように、特定のサブタスク ID を介してそのオブジェクトをフェッチすることで、それを完全に削除します。

NSArray *array = [self fetchObjectByEntityType:entityType byTaskID:[taskDic valueForKey:@"task_id"]]; // task_id from JSON dictionary
[self.managedObjectContext deleteObject:[array objectAtIndex:0]];
[self save];

ただし、これで問題なく動作することもありますが、ほとんどの場合、コンソールに次のエラー ログが表示されてアプリケーションがクラッシュします。

*キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: '無効な更新: セクションの数が無効です。更新後のテーブル ビューに含まれるセクションの数 (4) は、更新前のテーブル ビューに含まれるセクションの数 (4) に、挿入または削除されたセクションの数 (0 挿入、1削除されました)」

これは、テーブルビューの行/セクションが適切に更新されていないことが原因であることはわかっています.しかし、物事を正しくするためにあらゆる方法を試しました.ここで何が欠けているのか、または私のアプローチを教えてください! 前もって感謝します。

4

1 に答える 1