UITableView visibleCells在contentOffset之后返回了错误的单元格

时间:2015-07-10 08:46:26

标签: ios objective-c uitableview

我有一个tableView。我使用CADisplayLink来调用一些滚动tableView的代码。我这样做是因为我想自定义滚动而不是使用UITableView方法所花费的时间。

我想要一些缓动,所以我在displayLink滚动上调用invalidate然后再做一个contentOffset让它看起来不错。我向上滚动25分。然后我调用NSArray *array = self.tableView.visibleCells但是在我失效之后我从最终滚动之前得到了单元格。例如,我的数组保持数字1-8,我从底部开始,因此在启动时tableView中存在6,7,8。我按下UIButton并滚动2.1秒。它停止,调用另一种方法并向后滚动另一个方向25点。我的tableView显示

  

3 4 5

但是我的NSLog语句显示

  

2 3 4

问题是我无法在滚动后获得正确的索引或单元格。

-(void)scrollRoller{

    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(automaticScroll:)];

    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

}

-(void)automaticScroll:(CADisplayLink*)displayLink
{
    [self.tableView setContentOffset:CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y - 5) animated:NO];

    double test = self.displayLink.duration *self.displayLink.frameInterval;

    self.counter = self.counter + test;

    if (self.counter >= 2.1){

        [self.displayLink invalidate];


        [self.tableView setContentOffset:CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y + 25) animated:YES];

        NSArray* cells = self.tableView.visibleCells;

        NSLog(@"cells in first method %@", cells);
      self.counter = 0.0;

    }

2 个答案:

答案 0 :(得分:2)

在对`SELECT "DwgID", SUM( CASE WHEN "Current" = 1 THEN 1 ELSE 0 END ) "Current" FROM "tblRev" GROUP BY "DwgID" HAVING ( ( SUM( CASE WHEN "Current" = 1 THEN 1 ELSE 0 END ) > 1 ) )` 的类似问题进行一些测试后,我想我已经弄明白了发生了什么。

在调用相应的UICollectionView委托方法后,

visibleCells会更新。当您直接将tableView:cellForRowAtIndexPath:应用于contentOffset(或其子类)时,可能会调用UIScrollView来触发setNeedsDisplay或{{1}的更新在下一个屏幕更新中。

所以UITableView不能立即被调用。因此,您在{1}}的通话会在屏幕更新之前执行,并且不会返回您期望的单元格。

要解决您的问题,请致电UICollectionViewcellForRowAtIndexPath:

答案 1 :(得分:0)

对于集合视图,您可以使用

var visibleIndexes : [IndexPath] {
    let collectionViewBounds = self.bounds // the collection view visible container
    let paths =  gamesCollectionView.collectionViewLayout.layoutAttributesForElements(in:collectionViewBounds)!.map { $0.indexPath }.sorted(by: <)
    return paths
}