UITableView的scrollToRowAtIndexPath:atScrollPosition:animated的崩溃

来源:互联网 发布:怎么解锁windows驱动器 编辑:程序博客网 时间:2024/06/06 14:10

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


0 0
原创粉丝点击