使用 sectionForSectionIndexTitle 在 UITableView 中快速滚动

Posted

技术标签:

【中文标题】使用 sectionForSectionIndexTitle 在 UITableView 中快速滚动【英文标题】:Quick scroll in UITableView with sectionForSectionIndexTitle 【发布时间】:2015-11-04 10:08:21 【问题描述】:

我想通过点击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 并没有什么不同。

你有吗

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于使用 sectionForSectionIndexTitle 在 UITableView 中快速滚动的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)