我正在使用一个自定义的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开发很新,我想在提问之前做我的研究)。
答案 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问题。我终于发现表重新加载时单元格没有被重用。 当我设置每个单元格时,我有一些查询块,单元格总是重新创建使其闪烁。