索引UITableView,比如contacts.app



我想复制联系人。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;
}

相关内容

  • 没有找到相关文章

最新更新