使用sectionForSectionIndexTitle在UITableView中快速滚动

时间:2015-11-04 10:08:22

标签: ios objective-c iphone uitableview uiscrollview

我想通过点击UITableView旁边的sectionIndexTitles来滚动浏览UITableView。到目前为止,我的解决方案如下:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    NSIndexPath *matchingIndexPathForTitle = [self matchingIndexPathForSectionIndexTitle:title];
    if (matchingIndexPathForTitle) {
        [tableView scrollToRowAtIndexPath:matchingIndexPathForTitle
                         atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
    return 1;
}

但似乎因为iOS9总是滚动到UITableView 的顶部

我可以保证matchingIndexPathForTitle是正确的(例如第1部分,第22行),也可以保证更改为animated:NO没有任何区别。

  1. 对这种奇怪的行为有解释吗?或
  2. 对如何实现iOS 9的快速滚动有任何建议吗?

1 个答案:

答案 0 :(得分:1)

由于sectionForSectionIndexTitle负责滚动到右侧部分而不是单元格,因此在此方法中返回有效的部分索引号将取消所有自定义滚动事件。

要滚动到单元格,必须阻止滚动到该部分。这可以通过返回无效的部分索引来完成,例如-1

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    NSIndexPath *matchingIndexPathForTitle = [self matchingIndexPathForSectionIndexTitle:title];
    if (matchingIndexPathForTitle) {
        [tableView scrollToRowAtIndexPath:matchingIndexPathForTitle
                         atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
    return -1; // this will do the trick and not scroll to any section
}