添加#&在UITableView中搜索TableIndex

时间:2010-05-03 12:10:07

标签: iphone objective-c xcode uitableview indexing

在iPhone原生电话簿中 - 顶部有一个搜索字符& #字符在底部。

我想在我的表索引中添加这两个字符。

目前我已实施以下代码。

atoz=[[NSMutableArray alloc] init];

    for(int i=0;i<26;i++){
        [atoz addObject:[NSString stringWithFormat:@"%c",i+65]];
    }


- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    return atoz;
}

如何拥有#character&amp;在我的UITableView中搜索符号?

1 个答案:

答案 0 :(得分:5)

解决这个问题的最佳方法是利用框架提供的工具。在这种情况下,您想使用UILocalizedIndexedCollation(开发人员链接)。

我还有一个这个类的装饰器,用于为您插入{{search}}图标并处理偏移。它是UILocalizedIndexedCollat​​ion的类似替代品。

我已经发布了有关如何使用此on my blog的更深入的说明。装饰者可以使用here(Gist)。

基本思想是将您的集合分组为一个数组数组,每个数组代表一个部分。您可以使用UILocalizedIndexedCollation(或我的替代人员)来执行此操作。这是我用来执行此操作的小NSArray类别方法:

@implementation NSArray (Indexing)

- (NSArray *)indexUsingCollation:(UILocalizedIndexedCollation *)collation withSelector:(SEL)selector;
{
    NSMutableArray *indexedCollection;

    NSInteger index, sectionTitlesCount = [[collation sectionTitles] count];  
    indexedCollection = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];

    for (index = 0; index < sectionTitlesCount; index++) {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [indexedCollection addObject:array];
        [array release];
    }

    // Segregate the data into the appropriate section
    for (id object in self) {
        NSInteger sectionNumber = [collation sectionForObject:object collationStringSelector:selector];
        [[indexedCollection objectAtIndex:sectionNumber] addObject:object];
    }

    // Now that all the data's in place, each section array needs to be sorted.
    for (index = 0; index < sectionTitlesCount; index++) {
        NSMutableArray *arrayForSection = [indexedCollection objectAtIndex:index];

        NSArray *sortedArray = [collation sortedArrayFromArray:arrayForSection collationStringSelector:selector];
        [indexedCollection replaceObjectAtIndex:index withObject:sortedArray];
    } 
    NSArray *immutableCollection = [indexedCollection copy];
    [indexedCollection release];

    return [immutableCollection autorelease];
}

@end

所以,给定一个对象数组,例如books,我想根据它们的名称分成几个部分(Book类有一个name方法),我会做这样:

NSArray *books = [self getBooks]; // etc...
UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];
NSArray *indexedBooks = [books indexUsingCollation:collation withSelector:@selector(name)];