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



我使用的是一个自定义的uitableviewcell,它是用Objective C编写的(我所拥有的其他一切都是用Swift编写的),目的是为了方便客户滑动按钮。我有一个tableview,它使用这些单元格,我希望它更新,即使当其中一个滑动按钮(想想滑动删除按钮)显示。这是我的代码:

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];
        }
    }
}];

这将移动单元格以保持按钮在视图中。问题是,tableview需要重新加载来显示更改(更新子视图??)这会导致单元格移回起始位置,然后单元格被移回按钮显示位置。这会导致细胞随机闪现。我已经尝试过reloadCellsAtIndexPaths,同样的交易。我试着在动画周围隐藏和打开隐藏;使用不同的线程;Dispatch_sync和dispatch_async;从superview中删除表,更新,然后放回;UIView.animationsSetEnable(假的)块;deleteCellsAtIndexPaths和insertCellsAtIndexPaths都不起作用。这在我的iPhone 5和模拟器上可以复制。

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

dispatch_sync(dispatch_get_main_queue()) { }是你的问题的根源,把它改成dispatch_async(dispatch_get_main_queue()) { // reload table view },你就可以走了

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

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

我有闪光问题。我终于发现,单元格不重用时,表重新加载。当我设置每个单元格时,我有一些查询块,单元格总是重新创建,使其flash。

最新更新