reason: '-[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (0) beyond bounds (0) for section (0).
这个错误是传入的IndexPath已经越界了。需要在调用之前加入判断语句,不影响性能的情况下,在调用之前要先reloadDate
代码示例:
- (void)scrollToBottomAnimated:(BOOL)animated
{
if ([_messageList count] > 0 ) {
NSInteger lastSectionIndex = [self.tableView numberOfSections] - 1;
NSInteger lastRowIndex = [self.tableView numberOfRowsInSection:lastSectionIndex] - 1;
if (lastSectionIndex > 0 && lastRowIndex > 0) {
NSIndexPath *lastIndexPath = [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex];
[self.tableView scrollToRowAtIndexPath:lastIndexPath atScrollPosition: UITableViewScrollPositionBottom animated:animated];
}
}
}
Update:
上面的代码有BUG,当section = 1时,永远不会滚动。当section = 0时,
[self.tableView numberOfRowsInSection:lastSectionIndex]
会有崩溃,正确代码段:
@implementation UITableView (ScrollToTopOrBottom)
- (void)scrollToTopWithAnimated:(BOOL)animated
{
if ([self numberOfSections] > 0 && [self numberOfRowsInSection:0] > 0) {
[self scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:animated];
}
}
- (void)scrollToBottomWithAnimated:(BOOL)animated
{
if ([self numberOfSections] > 0) {
NSInteger lastSectionIndex = [self numberOfSections] - 1;
NSInteger lastRowIndex = [self numberOfRowsInSection:lastSectionIndex] - 1;
if (lastRowIndex > 0) {
NSIndexPath *lastIndexPath = [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex];
[self scrollToRowAtIndexPath:lastIndexPath atScrollPosition: UITableViewScrollPositionBottom animated:animated];
}
}
}
@end