无论我如何重新加载 UITableViewCell,它总是随机闪烁

No matter how I reload UITableViewCell, it always flashes randomly

我正在使用自定义 uitableviewcell,它是用 Objective C 编写的(我所有的其他东西都是用 Swift 编写的),目的是方便客户滑动按钮。我有一个使用这些单元格的 table 视图,我希望它即使在显示其中一个滑动按钮(想想滑动删除按钮)时也能更新。这是我的代码:

dispatch_async(dispatch_get_global_queue(priority, 0)) {
                // do some task
                dispatch_sync(dispatch_get_main_queue()) {

                self.tasksTableView.reloadData()

                    self.tasksTableView.cellForRowAtIndexPath(NSIndexPath(forRow: searchForTaskByName(taskSlices[selectedSlice].name), inSection: 0))!.contentView.addSubview(self.view1)

                    (self.tasksTableView.cellForRowAtIndexPath(NSIndexPath(forRow: searchForTaskByName(taskSlices[selectedSlice].name), inSection: 0)) as! SESlideTableViewCell).setSlideState(SESlideTableViewCellSlideState.Left, animated: true)
    })
    })

现在,我添加的子视图是一个矩形,最初覆盖单元格,但随着时间的推移缩小(有点像反向加载栏)。第三行是自定义代码的一部分:

    [UIView animateWithDuration: 0.0 delay: 0.0 options:UIViewAnimationOptionCurveLinear  animations:^{
    //code with animation
    CGRect frame = snapshotView.frame;
    frame.origin.x = targetPositionX;
    snapshotView.frame = frame;
    m_slideState = slideState;
    //[m_leftButtonGroupView layoutIfNeeded];
    //[m_rightButtonGroupView layoutIfNeeded];
} completion:^(BOOL finished){
    if (finished) {
        if (animationId != m_slideAnimationId) {
            return;
        }
        m_slideState = slideState;
        if (slideState == SESlideTableViewCellSlideStateCenter) {
            m_preparedSlideStates = SESlideStateOptionNone;
            isMoved1 = NO;
            [self cleanUpSlideView];
        }
    }
}];

这会移动单元格以使按钮保持可见。现在,问题是,table 视图必须重新加载以显示更改(更新子视图??),这会导致单元格移回起始位置,然后单元格移回按钮显示位置。这会导致电池随机闪烁。我已经尝试过 reloadCellsAtIndexPaths,同样的交易。我试图隐藏和取消隐藏动画;使用不同的线程; dispatch_sync 和 dispatch_async;从 superview 中删除 table,更新并放回原处; UIView.animationsSetEnable(false) 块; deleteCellsAtIndexPaths 和 insertCellsAtIndexPaths,没有任何作用。这可以在我的 iPhone 5 和模拟器上重现。

我真正需要的是弄清楚 reloadData 做了什么,这样我就可以只调用我需要的位,并且希望不要对任何东西进行动画处理。我使用的所有动画都有时间 0.0 并且没有延迟。我是 运行 后台的一个小计数算法,如果这很重要的话,它每 .01 秒可变 ++ 一次。感谢您能给我的任何帮助,我已经为此工作了两天(我对 iOS 开发还很陌生,我想在提问之前先做研究)。

好吧,我找到了一个非常棘手的修复方法。我创建了一个重复的 UITableView,我把它放在主视图下面。我将主要的设置为从 superview 中删除,然后通过 reloadData 调用和这两个调用之间的其他更新放回去。这将在一瞬间显示第二个表视图,然后在第一次更新后 0.5 秒我将更新第二个表视图以使其保持最新。这确实有效。我不敢相信它会起作用,而且我很惊讶它是必要的。我仍然在寻找一个合法的解决方案,所以我暂时不会接受我的答案,以防有人能帮助我。

dispatch_sync(dispatch_get_main_queue()) { } 是您问题的根源,请将其更改为 dispatch_async(dispatch_get_main_queue()) { // reload table view } 并且一切顺利

[self.tableView registerNib:[UINib nibWithNibName:@"CellXibName" bundle:nil] forCellReuseIdentifier:CELL_IDENTIFIER];

我有闪光灯 problem.I 终于发现 table 重新加载时单元格没有被重新使用。 当我设置每个单元格时,我有一些查询块,单元格总是重新创建使其闪烁。