【问题标题】:Deleting objects within a for loop from a NSMutableArray从 NSMutableArray 中删除 for 循环中的对象
【发布时间】:2013-01-23 02:38:05
【问题描述】:

我正在使用UITableView,并且对于作为UITableView 数据源的数组中的每个对象,如果它们满足某个if 语句,我将删除它们。我的问题是它只会从数组中删除所有其他对象。

代码:

UIImage *isCkDone = [UIImage imageNamed:@"UITableViewCellCheckmarkDone"];
int c = (tasks.count);
for (int i=0;i<c;++i) {
    NSIndexPath *tmpPath = [NSIndexPath indexPathForItem:i inSection:0];
    UITableViewCell * cell = [taskManager cellForRowAtIndexPath:tmpPath];
    if (cell.imageView.image == isCkDone) {
        [tasks removeObjectAtIndex:i];
        [taskManager deleteRowsAtIndexPaths:@[tmpPath]
                withRowAnimation:UITableViewRowAnimationLeft];
    }
}

这有什么问题?

【问题讨论】:

    标签: ios objective-c xcode uitableview nsmutablearray


    【解决方案1】:

    你必须向后运行你的循环,即

    for (int i=c-1;i>=0;--i)
    

    如果您以相反的方式运行它,则删除索引位置i 处的对象会将数组中i 后面的对象向前移动一个位置。最后,您甚至会超出数组的边界。

    【讨论】:

    • 如果在删除对象时适当地减少i,则可以向前运行循环。但是,按照您的建议,向后运行循环会更简单。
    【解决方案2】:

    如果您想保持循环向前运行,您可以:

    当你的条件满足并且你removeObjectAtIndex时减少i

        if (cell.imageView.image == isCkDone) {
            ...
            --i ;
            ...
        }
    

    或在不满足您的条件时增加i

    for ( int i=0 ; i<c ; ) {
        ...
        if (cell.imageView.image == isCkDone) {
            ...
        } else {
        ++i ;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多