At canEditRowAtIndexPath Method, reloadData of UITableView not work properly?

前端 未结 5 780
离开以前
离开以前 2021-01-05 23:05

In my application, I reload my TableView ([tablView reloadData];) after delete row from TableView then canEditRowAtIndexPath Method alway

相关标签:
5条回答
  • 2021-01-05 23:11

    the 'removeObjectAtIndex:indexPath' takes some time and I suspect your [self.tblView reloadData] is being called early. I tried a sample code and found success with [UiTableView beginUpdates] and [UiTableView endUpdates] you may also avoid crash if you put a little delay before the reloading or deleting rows haven't tried it though

    [tableTable beginUpdates];
    [tableArray removeObjectAtIndex:indexPath.row];
    [tableTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    [tableTable endUpdates];
    
    0 讨论(0)
  • 2021-01-05 23:15

    When it comes to me, I analysed as below:

    As commented by rmaddy on Nitin Gohel's answer:

    1. You should always remove the data from the data source before updating the table.

      I feels this is the ideal way.

    2. If you are going to call reloadData, there is no reason at all to first call deleteRowsAtIndexPath.

      This is also looks correct.

    I analysed ambiguity, if I write reloadData its crashishing but once I write deleteRowsAtIndexPath it worked well.

    Hope someone will emphasise on this issue for its causes etc.

    0 讨论(0)
  • 2021-01-05 23:22

    you need to remove raw from tableview also befor remove item from array and reload data using this line becouse remove item from array but not tableview.

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        if (editingStyle == UITableViewCellEditingStyleDelete)
        {
            [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB
    
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array
    
            [self updateListofSoundsFile]; /// Custom method
        }
    }
    
    0 讨论(0)
  • 2021-01-05 23:28
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        if (editingStyle == UITableViewCellEditingStyleDelete)
        {
            [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB
            [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array
            [self updateListofSoundsFile]; /// Custom method
        }
       [self.tblView reloadData]; 
    }
    
    0 讨论(0)
  • 2021-01-05 23:31

    I ran into this same problem. The issue was that I deleted the object of the cell but when I used the reloadData method of the tableView, my canEditRowAtIndexPath method was not being called resulting in being able to edit cells that I do not want edited. The true fix was not calling the deleteRowsAtIndexPaths method, but the [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; method.

    Basically here is what was happening:

    When I called reloadData: The raw data was not being removed from the tableView as Nitin said. Therefore this is not the solution.

    When I called deleteRowsAtIndexPaths: iOS detected a discrepancy between the underlying data and the number of cells (because I had already removed the underlying object). The result was a crash which is also not the solution (obviously).

    Now for The Fix!

    When I called reloadRowsAtIndexPaths: This caused the tableView to simply reload that single cell AND it got rid of the raw data. This is the solution.

    Rather than removing the dataSource object, then trying to remove the cell that is essentially backed by nothing at this point (which causes a crash), simply remove the dataSource object, then reload that indexPath of the tableView

    Here is the general format of the method:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (editingStyle == UITableViewCellEditingStyleDelete)
        {
            [myDataSourceArray removeObjectAtIndex:indexPath.row];
            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
        }
    }
    

    This is the first time I ran into the issue with the residual raw data that is not removed by simply calling the reloadData method. This is certainly the most elegant solution that I have seen thus far.

    Happy Coding! I hope this helps.

    0 讨论(0)
提交回复
热议问题