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

时间:2015-08-18 19:54:45

标签: swift uitableview reloaddata

我正在使用一个自定义的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(false)块; deleteCellsAtIndexPaths和insertCellsAtIndexPaths,NOTHING将起作用。这可以在我的iPhone 5和模拟器上重现。

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

3 个答案:

答案 0 :(得分:0)

好吧,我发现了一个真正的hacky修复。我创建了一个重复的UITableView,我把它放在主要的UITableView下面。我将主要设置为从superview中删除,然后在这两个调用之间放回reloadData调用和其他更新。这将显示第二个tableview一瞬间,然后在第一次更新后0.5秒我将更新第二个tableview以使其保持最新状态。这实际上有效。我无法相信它有效,我很惊讶它是必要的。我仍然在寻找一个合法的解决方案,所以我暂时不接受我的回答,万一有人可以帮助我。

答案 1 :(得分:0)

$result = $GLOBALS['mandrill']->messages->info($id); $status = $result['state']; 是您问题的根源,将其更改为dispatch_sync(dispatch_get_main_queue()) { }并且您有好处

答案 2 :(得分:0)

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

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