我想复制联系人。App的滚动条行为
我知道你必须实现这两个方法:
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;
这就是我所做的:第一个返回A到Z的字符数组,第二个返回索引。到目前为止,它工作得很好:我有滚动条,滚动它使UITableView滚动。
但是我有两个问题:
首先,问题是,如果我没有字母C的联系人,那么滚动将明显交错,滚动C将显示D索引,滚动D将显示E索引……我想搜索最近的部分,但这是最有效的方法吗?类似于在我的类中实现这个函数:
- (NSInteger) getSectionIndexForSectionTitle:(NSString *section) {
if ([_allSections objectForKey:section] == nil) {
NSComparisonResult res = NSOrderedAscending;
for (NSString* sectionTitle in _allSections) {
NSComparisonResult tmp = [sectionTitle compare:section];
if (tmp == NSOrderedDescending && res == NSOrderedAscending)
return [(NSNumber *)[_allSections objectForKey:sectionTitle] intValue];
res = tmp;
}
return [_allSections count] - 1;
}
return [(NSNumber *)[_allSections objectForKey:section] intValue];
}
但是我担心这个解决方案可能会提供很差的性能。
第二个问题,它可能与第一个问题相关联:在联系人中。应用程序,你看不到滚动条上的"O"字母,但你仍然可以滚动到这个部分。有什么办法吗?
感谢你的阅读和帮助!
不需要修改section header的高度。有一个类就是为你要找的目的而设计的:UILocalizedIndexedCollation。关于如何在表视图中让索引滚动有一个很好的描述
为了解决你的问题,我认为有一个替代的解决方案。尝试改变heightForHeaderInSection来隐藏section头,这使得空section被隐藏,所以当滚动到该section索引时,它将显示最近的section。
你把所有的section标题保存在数组中从sectionIndexTitlesForTableView返回然后用户可以滚动到那个位置
所以实现heightForHeaderInSection来隐藏没有行的section,在你的sectionIndexTitlesForTableView中,sectionForSectionIndexTitle会返回你拥有的任何东西不要试图操纵索引
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
{
NSInteger nRowCount = [[_arrSectionCounts objectAtIndex:section] integerValue];
if ( nRowCount == 0 ) {
return 0.0f;
}
return 22.0f;
}