Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS UITableview使用动画删除行_Ios_Objective C_Uitableview - Fatal编程技术网

iOS UITableview使用动画删除行

iOS UITableview使用动画删除行,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我看到了很多关于它的问题,但没有找到解决我问题的办法 我有一个自定义单元格的tableview。在每个单元中我都有一个计时器。当时间结束时,我发送一条消息来删除该行(这不是我使用消息接收的唯一地方) 我收到了这个错误(取决于我玩应用程序时有多少数据): 无效更新:节0中的行数无效。更新后现有节中包含的行数(4)必须等于更新前该节中包含的行数(6),加上或减去从该节中插入或删除的行数(0插入,1删除),加上或减去移入或移出该节的行数(0移入,0移出) 当我有很多数据超时时,就会发生错误 注意:如果

我看到了很多关于它的问题,但没有找到解决我问题的办法

我有一个自定义单元格的tableview。在每个单元中我都有一个计时器。当时间结束时,我发送一条消息来删除该行(这不是我使用消息接收的唯一地方)

我收到了这个错误(取决于我玩应用程序时有多少数据):

无效更新:节0中的行数无效。更新后现有节中包含的行数(4)必须等于更新前该节中包含的行数(6),加上或减去从该节中插入或删除的行数(0插入,1删除),加上或减去移入或移出该节的行数(0移入,0移出)

当我有很多数据超时时,就会发生错误

注意:如果我不使用“deleteRowsAtIndexPaths”,只需从数据中删除并重新加载它就可以完美地工作

请执行以下操作:
一,。将变量添加到类接口:
dispatch\u queue\u t\u deleteque

二,。在
viewdiload
中初始化QUE:
\u deleteQUE=dispatch\u queue\u create(“com.delte.qUE”,NULL)
3.最后,将方法的实现更改为如下所示:

dispatch_sync(_deleteQeue, ^{
    //your deletion code that you have implemented. Deletion from datasource array
    dispatch_async(dispatch_get_main_queue(), ^{
        //cell delete code here. The table animation code. with begin and end updates.
    });
});
****编辑***
让我们试试这个

@synchronized (self) {
    // your deletion code with begin and end updates for the table. Throw away the dispatch code, go back to the old code with Begin and end updates and apply lock. like this.
}

昨天我用你建议的方法解决了你在N.B.中写的类似问题。我认为,当表数据源变得混乱时,就会出现这个问题。为了克服这种情况,一种可能的解决方案是实现正确的行删除流程

BOOL isDeleteInProgress

步骤:

  • 当计时器事件触发(调用)时,将isDeleteInProgress设置为YES
  • 如果由于另一个计时器再次调用,请检查isDeleteInProgress是否为NO,然后仅设置为YES
  • 现在编写下面的代码来删除这些行

    [self.tableView开始更新]

    [self.tableView deleteRowsAndExpaths:deleteIndexPaths with RowAnimation:UITableViewRowAnimationFade]

    [self.tableView endUpdates]

  • 一旦行删除成功,将isDeleteInProgress设置为NO

这将阻止continuos调用删除,并可能阻止您出现此(未解决的)异常

我已经阅读了您的评论(任何要显示的代码(一周前启动的iosdev:D)),所以我要添加一个伪代码来帮助您

- (void)timerEventFire:(NSTimer*)timer {
    if(!isDeleteInProgress) {
        //write code to delete the rows
        //invalidate timer
        //isDeleteInProgress = NO;
    }
}

祝你好运

尝试使用异步串行que来显示删除逻辑(在通知方法中)。这样,删除将按FIFO顺序序列化。或者最好检查我下面给出的代码。任何要显示的代码(一周前启动的iOS dev:D)建议使用
beginUpdates
endUpdates
。此外,请确保删除后的行/节数等于数据源数组中的项目数。我知道,当同时删除多个数据时,您的方法会在执行表单元格删除动画时从数组中删除多个数据。因此问题就来了。我猜您必须使用序列化队列。仍然存在相同的问题:(我在第一次调度中从数据中删除数据,在第二次调度中,我调用被beingUpdates和EndUpdates包围的单元格删除。我已将第一次调度更改为在同步上运行。试试看。我想UI更新应该在队列为空并且在有东西进入队列之前执行。是的。您需要这样做,以便每次执行一次tem从数组和一个单元格中删除,在单元格删除完成之前,我们不会从数组中删除另一项。我认为我们应该应用锁并查看。这看起来是一个很好的解决方法,但如何管理未删除的行,因为删除已在进行中?@Titmael,我们不必担心数据源it将管理未删除的行自己
- (void)timerEventFire:(NSTimer*)timer {
    if(!isDeleteInProgress) {
        //write code to delete the rows
        //invalidate timer
        //isDeleteInProgress = NO;
    }
}