无论我如何重新加载 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 重新加载时单元格没有被重新使用。
当我设置每个单元格时,我有一些查询块,单元格总是重新创建使其闪烁。
我正在使用自定义 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 重新加载时单元格没有被重新使用。 当我设置每个单元格时,我有一些查询块,单元格总是重新创建使其闪烁。