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

标签 swift uitableview reloaddata

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

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)
    })
    })

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

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

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

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

最佳答案

dispatch_sync(dispatch_get_main_queue()) { } 是您问题的根源,将其更改为 dispatch_async(dispatch_get_main_queue()) {//重新加载 TableView } 和您的好去

关于swift - 无论我如何重新加载 UITableViewCell,它总是随机闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32081512/

相关文章:

ios - 带有 invalidateSupplementaryElements 和 UICollectionViewLayoutInvalidationContext 的 invalidateLayout

ios - 在一个 VC 上显示后重新设置 WKWebView

iphone - 自定义 UITableViewCell 不显示 Storyboard中的标签

objective-c - xcode重新加载tableview

swift - 在 UITableView 重新加载时从 SDWebImage 设置图像

ios - UITabBarController 动画的转换委托(delegate)

file - NSData(文件内容 : "someexistingfile") returns nil in Playground

ios - 自动布局 UITableViewCell

iOS:键盘问题背后的表格 View 隐藏部分

ios - 如何通过 iOS Objective C 中的 appDelegate 从另一个 View Controller 重新加载 TableView