20160830UILocalizedIndexedCollation的使用

原创 2016年08月30日 16:55:59

我在开发中曾经有这样的需求,就是对通讯录的字符串排序,这个需求很大众,我参与开发的两个app都遇到,我是一般会追求最优解决方案的,发现了UILocalIndexedCollation,那比自己写得排序要强大多了吧,如果是自己的排序要考虑很多问题的,比如多音字问题,有时排序不怎么正确,尤其是对于一些特殊问题,而且效率不高,对于很大数据量,所以还是选择UILocalIndexedCollation比较合适。 本文主要介绍 UILocalIndexedCollation 的使用。查看苹果文档

The UILocalizedIndexedCollation class is a convenience for organizing, sorting, and localizing the data for a table view that has a section index. The table view’s data source then uses the collation object to provide the table view with input for section titles and section index titles.

Table views with section indexes are ideal for displaying and facilitating the access of data composed of many items organized by a sequential ordering scheme such as the alphabet. Users tap an index title to jump to the corresponding section. The initial table view of the Phone/Contacts application on the iPhone is an example. Note that the section titles can be different than the titles of the index. 

To prepare the data for a section index, your table-view controller creates a indexed-collation object and then, for each model object that is to be indexed, calls sectionForObject:collationStringSelector:. This method determines the section in which each of these objects should appear and returns an integer that identifies the section. The table-view controller then puts each object in a local array for its section. For each section array, the controller calls the sortedArrayFromArray:collationStringSelector: method to sort all of the objects in the section. The indexed-collation object is now the data store that the table-view controller uses to provide section-index data to the table view, as illustrated in Listing 1.

上面第三段文字给出了大概的解题思路,我们首先可以将需要排序的数据分成几个section 部分,在对每个部分进行排序。下面来段实例代码。


    UILocalizedIndexedCollation *indexedCollation =
    [UILocalizedIndexedCollation currentCollation];
    
    //  Iterate over the products, populating their section number
    for (Product *theProduct in productsTemp) {
        NSInteger section = [indexedCollation sectionForObject:theProduct
                                       collationStringSelector:@selector(name)];
        theProduct.section = section;
    }
    
    //  Get the count of the number of sections
    NSInteger sectionCount = [[indexedCollation sectionTitles] count];
    
    //  Create an array to hold the sub arrays
    NSMutableArray *sectionsArray = [NSMutableArray
                                     arrayWithCapacity:sectionCount];
    
    // Iterate over each section, creating each sub array
    for (int i=0; i<=sectionCount; i++) {
        NSMutableArray *singleSectionArray = [NSMutableArray
                                              arrayWithCapacity:1];
        [sectionsArray addObject:singleSectionArray];
    }
    
    // Iterate over the products putting each product into the correct sub-array
    for (Product *theProduct in productsTemp) {
        [(NSMutableArray *)[sectionsArray objectAtIndex:theProduct.section]
         addObject:theProduct];
    }
    
    // Iterate over each section array to sort the items in the section
    for (NSMutableArray *singleSectionArray in sectionsArray) {
        // Use the UILocalizedIndexedCollation sortedArrayFromArray: method to
        // sort each array
        NSArray *sortedSection = [indexedCollation
                                  sortedArrayFromArray:singleSectionArray
                                  
                                  collationStringSelector:@selector(name)];
        [self.products addObject:sortedSection];
    }

productsTemp是需要排序的数据,Pruduct 是一条数据的模型,product可以有 name ,manufacture,details等字段,现在可以添加section这个字段,通过 

sectionForObject:collationStringSelector: 获得这个section并且保存。获取每部分的 sectionArray ,然后对没部分里面的数据进行排序,可以通过

sortedArrayFromArray:collationStringSelector

这个函数,最后得到 sortedSection 排好序的数据。




IOS之NSArray 中调用的方法详解(1)

下面的例子以      NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"jonery",@"stany", ...
  • shx_yi
  • shx_yi
  • 2013年03月18日 22:00
  • 68536

NSArray中的数据进行排序 ---- sortedArrayUsingDescriptors

//组装数据 array=[[NSMutableArray alloc] initWithCapacity:11]; NSMutableDictionary *dir6=[[NSMutab...
  • wishfly
  • wishfly
  • 2012年02月23日 23:08
  • 5607

iOS 使用UILocalizedIndexedCollation实现通讯录样式的索引

前一段时间要在应用程序中要加入检索的功能,在网上找了很多是手写的,于是今天在这里写一下备忘。直接贴的项目代码。 第一步:对数据源进行排序和分区处理。这里addressBookArray是存储最后...

ubuntu知识汇总(20160830)

添加PATH环境变量第一种方法:临时export PATH=/your/bin/folder1/:/your/bin/folder2/:$PATH每个目录要用:号分隔。查看是否添加成功echo $PA...

IOS开发(52)之UITableView索引搜索之UILocalizedIndexedCollation

1 前言 IOS对于TableView的表格索引还停工一个工具类--UILocalizedIndexedCollation,今天我们就来学习一下这个控件。 2 代码实例 ZYAppDelegat...

iOS仿微信联系人界面中联系人按姓名首字母分类UILocalizedIndexedCollation

字母分组排序神器:UILocalizedIndexedCollation - (void)configureTableViewSection { // 实例化 UILoca...

本地化下按首字母分组排序的神器——UILocalizedIndexedCollation

一个很简单的通讯录相关的项目,通讯录当然就少不了按首字母或者汉字拼音首字母分组排序索引。 SDK里已经提供了一个实现此功能的神器——UILocalizedIndexedCollation...
  • haiooh
  • haiooh
  • 2016年12月02日 11:45
  • 249

iOS UILocalizedIndexedCollation排序神器

UILocalizedIndexedCollation 是一个帮助我们组织列表数据的类,它能够根据地区来生成与之对应区域索引标题。不需要直接创建它的对象,我们可以通过 UILocalizedIndex...

iOS开发------通讯录分组排序(UILocalizedIndexedCollation)

最近写了两篇关于通讯录的博文,通过前两篇博文的简要描述与介绍,基本是能够读出通讯录中的联系人,并能完成对通讯录增删改的操作,但在真实开发中,列出联系人之后是需要分组的,毕竟不能把联系人无规律的排列在t...

UILocalizedIndexedCollation 的浅分析

这篇文章是我在看过其英文档后写得。。。。 UILocalizedIndexedCollation 是相当于是tableView的一个辅助类,用来对tableView的数据源进行管理,排序,定位。 U...
  • lnnxsh
  • lnnxsh
  • 2013年07月08日 20:43
  • 5395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:20160830UILocalizedIndexedCollation的使用
举报原因:
原因补充:

(最多只允许输入30个字)