如何按字母顺序创建分段/分组表视图

时间:2010-10-29 10:32:33

标签: iphone uitableview ios4

我正在创建一个解析大型xml文件并将数据导入表视图的应用程序。用户可以在搜索栏中输入文本以搜索表格视图。

现在,我希望将表格视图转换为按字母顺序分组的分段视图。正确的表视图是巨大的,包括搜索功能我想知道如何将表视图分成几个部分...任何教程或来源将有很大的帮助...

2 个答案:

答案 0 :(得分:6)

您必须使用配置为部分索引的表视图 见Table View Programming Guide for iOS

填充索引列表

[...]索引列表是普通样式的表视图,通过三个UITableViewDataSource方法专门配置:

  • sectionIndexTitlesForTableView:
  • tableView:titleForHeaderInSection:
  • tableView:sectionForSectionIndexTitle:atIndex:

第一个方法返回一个字符串数组用作索引条目(按顺序),第二个方法将这些索引字符串映射到表视图节的标题(它们不必相同) ,第三种方法返回与用户在索引中点击的条目相关的节索引。

应该组织用于填充索引列表的数据以反映此索引模型。具体来说,您需要构建一个数组数组。每个内部数组对应于表中的一个部分;根据主要的排序方案对区段阵列进行排序(或整理)在外部阵列内,该排序方案通常是字母方案(例如,A到Z)。此外,每个节数组中的项目都已排序。您可以自己构建和排序这个数组数组,但幸运的是,UILocalizedIndexedCollat​​ion类使构建和排序这些数据结构以及向表视图提供数据的任务变得更加容易。该类还根据当前的本地化来整理数组中的项目。

答案 1 :(得分:1)

您可以在https://github.com/shreeshgarg/sectiontable

获取示例项目

首先,你必须使用NSSortDescriptor对数据进行排序,而不是创建一个字典,其中键是第一个数字字母,每个键应该有一个从相同字母开始的记录数组。

你可以这样做

-(NSMutableDictionary *)fillingDictionary:(NSMutableArray *)ary
{

// This method has the real magic of this sample
// ary is the unsorted array
// keyArray should be global as you need to access it outside of this function

     keyArray=[[NSMutableArray alloc]init];
    [keyArray removeAllObjects];

    NSMutableDictionary *dic=[[NSMutableDictionary alloc]init];

    // First sort the array

    [ary sortUsingSelector:@selector(compare:)];


    // Get the first character of your string which will be your key

    for(NSString *str in ary)
    {
        char charval=[str characterAtIndex:0];
        NSString *charStr=[NSString stringWithUTF8String:&charval];
        if(![keyArray containsObject:charStr])
        {
            NSMutableArray *charArray=[[NSMutableArray alloc]init];
            [charArray addObject:str];
            [keyArray addObject:charStr];
            [dic setValue:charArray forKey:charStr];
        }
        else
        {
            NSMutableArray *prevArray=(NSMutableArray *)[dic valueForKey:charStr];
            [prevArray addObject:str];
            [dic setValue:prevArray forKey:charStr];

        }

    }
    return dic;

}