我使用的是一个自定义的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。