0

这在不同的地区有什么不同吗?我完全不明白该sectionForSectionIndexTitleAtIndex方法的意义UILocalizedIndexCollation是什么。我传递的每个索引都只返回相同的索引。

该文档根本不是很有帮助,我似乎找不到任何实例,它返回的数字与我提供的数字不同。为什么不直接返回数字本身?

更糟糕的是,如果我向我的表格视图添加额外的索引,例如UITableViewIndexSearch一些自定义索引,那么我的表格视图的部分索引标题总共有搜索字符、两个自定义的、字母和 #(总共 30部分标题),我不知道sectionForSectionIndexTitleAtIndex从方法传入UITableViewDataSource什么sectionForSectionIndexTitle:atIndex:

如果我通过表格视图方法给我的索引(比如 1),它会给我 1,这是错误的,因为如果我点击部分索引 1,它应该跳转到第一个自定义的。所以我应该只在字母部分开始时开始,它从部分索引 3 开始。但如果我将 3 传递给sectionForSectionIndexTitleAtIndex方法,我会得到 3,而我应该得到 2,因为搜索字符不是实际的部分.

所以我应该只在 3 之后开始,此时我减去 1 以获得实际索引。好的。然后我到达索引 29 处的最后一个部分索引 #。我将 29 - 1(即 28)传递给sectionForSectionIndexTitleAtIndex,然后我得到一个错误,它超出了范围,因为只有 27 个字符。

在这种情况下我到底应该如何使用它?好像完全没用,感觉只是返回索引而已。但这会在某些语言环境下中断吗?这种方法是如何工作的?

4

1 回答 1

1

让我们退一步说一下表格视图数据源的方法tableView:sectionForSectionIndexTitle:atIndex:

的目的tableView:sectionForSectionIndexTitle:atIndex:通常是您手动创建节和节标题(用于索引),并且您将在索引中显示的节标题少于实际的节。

另一个用途是手动创建节和节标题,并且在索引中添加额外的节标题。例如,一个常见的约定是使第一个索引项成为放大镜,用户可以点击它来查看表格视图(其标题视图)顶部的搜索字段。这是一个处理这种情况的实现:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    if (index == 0)
        [tableView scrollRectToVisible:tableView.tableHeaderView.frame
                              animated:NO];
    return index-1;
}

(如果索引为零,我们最终会返回-1,这不是一个真正的索引,但它也没有害处。)

使用 UILocalizedIndexCollat​​ion,您无需手动创建节和节标题:排序规则是。您正在将控制权交给它。您不知道章节标题的数量是否与章节的数量相同。所以你必须提供一个实现tableView:sectionForSectionIndexTitle:atIndex:,以防万一。因此,您可以tableView:sectionForSectionIndexTitle:atIndex:通过询问排序规则来实现它sectionForSectionIndexTitleAtIndex,如文档中所示:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
}

因此,您的问题“ sectionForSectionIndexTitleAtIndexUILocalizedIndexCollat​​ion 方法的意义是什么”的答案是:这样您就可以tableView:sectionForSectionIndexTitle:atIndex:在使用排序规则时实现。对于特定的本地化排序规则,部分标题和部分之间可能存在一一对应关系,也可能不存在;但你不知道,你不在乎。只需按照文档中的样板文件告诉您的操作,您就可以了。

于 2016-02-20T21:18:08.790 回答