UITabelView scrollToRowAtIndexPath滚动到底部有时会使我的表格消失,为什么?

时间:2017-03-15 06:10:20

标签: ios objective-c

我希望我的桌面视图在第一次进入视图时滚动到底部,但有时候不会滚动到底部,有时会使我的桌子消失。 (通常在第一次或第二次发生时)。

这是我的滚动代码:

- (无效)tableScrollToBottom {

[self.tableView reloadData];

dispatch_async(dispatch_get_main_queue(), ^{
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection: ([self.tableView numberOfSections]-1)];
    [self.tableView scrollToRowAtIndexPath:indexPath
                          atScrollPosition:UITableViewScrollPositionBottom
                                  animated:YES];

});   
}

并且我在viewDidAppear中也有[self tableScrollToBottom],因为如果我只在viewDidLoad中滚动表格,那么表格总是不会滚动到最底层,我不知道为什么,它是'我真的很困惑。

我尝试将[self.tableView layoutIfNeeded]放在[self tableScrollToBottom]中,并删除dispatch_async,这似乎是我第一次打开应用程序并进入视图时仍然无法滚动到最底层在第一次之后,它会正确滚动到底部,我不知道第一次打开应用程序和进入该视图之间以及第一次之后的区别。(my数据来自服务器,它来自之前,我的tableview行高是动态的。

现在我的代码在[self tableScrollToBottom]中:

-(void)tableScrollToBottom {

    [self.tableView layoutIfNeeded];

    NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection: ([self.tableView numberOfSections]-1)];

    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

}

在这里我打电话给[self tableScrollToBottom]:

-(void)getDicData {

    for (int i = 0; i < _csDictArr.count; i ++) {

        [_chatPersonArray addObject:_csDictArr[i][@"Person"]];
        [_chatDataArray addObject:_csDictArr[i][@"Message"]];
        [_chatDateTimeArr addObject:_csDictArr[i][@"Time"]];                

    }

    [self.tableView reloadData];
    [self tableScrollToBottom];

}

我把[self getDicData]放在ViewDidLoad中,我也在viewDidAppear中调用tableScrollToBottom

-(void)viewDidAppear:(BOOL)animated {

    [self tableScrollToBottom];

}

1 个答案:

答案 0 :(得分:1)

您应该使用CATransaction确保tableView在将其滚动到底部之前完全重新加载。

[CATransaction begin];
[CATransaction setCompletionBlock:^{
        CGFloat yOffset = 0;
        if (self.tableView.contentSize.height > self.tableView.bounds.size.height) {
            yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
        }
        [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:YES];
}];
[self.tableView reloadData];
[CATransaction commit];