scrollViewDidScroll被称为"两次"设置表偏移后

时间:2016-12-25 05:18:43

标签: ios uitableview offset reloaddata

大家好(和圣诞快乐)

希望有人可以回答我的问题,这将是一个美好的圣诞节  礼品。

我的UIViewController在表格区域中有一个带有分段控件的表。看起来像这样 enter image description here

每次用户点击分段控件时,我都会重新加载表数据,希望表格显示正确的位置(不完全是行位置,所以我使用表格内容偏移)。这是我的代码:

- (void)clickSegmentedCenter code hereontrol:(int)index {
    self.firstTableOffset = 72;
    self.secondTableOffset = 250;
    self.thirdTableOffset = 600;

    CGFloat offset_y = 0;        
    switch (index) {
            case 0:
                offset_y = self.firstTableOffset;
                break;

            case 1:
                offset_y = self.secondTableOffset;
                break;

            case 2:
                offset_y = self.thirdTableOffset;
                break;
    }

    NSLog(@"[Debug] offset y is %f", offset_y);

    [self.tableView reloadData];
    self.tableView.contentOffset = CGPointMake(0, offset_y);
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    CGPoint offset = scrollView.contentOffset;
    NSLog(@"[XXX] offset y is %f", offset.y);
}

我得到的问题是,在表重新加载数据之后,似乎我不应该立即调用self.tableView.contentOffset。我的桌子没有滚动到我设置的位置。我发现scrollViewDidScroll被调用了两次!日志消息如下所示:

enter image description here

所以有人知道正确的方法是重新加载表数据并将表滚动到特定位置吗?提前致谢。

更新:事实证明我的代码是正确的。原因是在我的viewDidLoad中,我设置了

self.tableView.estimatedRowHeight = 230.0;

由于某种原因,此设置会导致问题。在我评论这一行之后..行为是正确的。最初我设置了我的桌子估计的羽毛高度是因为我的牢房的高度是动态的。现在这个问题解决了。感谢你们这里的建议。圣诞节快乐 !!!

1 个答案:

答案 0 :(得分:2)

请您更新scrollViewDidScroll,如下所示,然后尝试:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    dispatch_async(dispatch_get_main_queue(), ^(void){
    CGPoint offset = scrollView.contentOffset;
    NSLog(@"[XXX] offset y is %f", offset.y);
    });
}