1,uitableview中涉及到排序的问题,查找资料后发现使用UILocalizedIndexedCollation可以很好处理中文和英文系统下中文的排序。而且如果第一个汉字首字母一样那么就会按照第二个开始排序。

2,如果tableview的高度不是整个全屏的,比如有导航栏定制等,那么ios7.0下会缩减显示。呈现的是带有圆点的效果。其他系统不会。且无法修改。

效果如下:

代码如下:

#pragma mark -
#pragma mark Table view data source and delegate methods
//设置Section的数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // The number of sections is the same as the number of titles in the collation.
    return [[collation sectionTitles] count];
}

//设置每个Section下面的cell数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    // The number of time zones in the section is the count of the array associated with the section in the sections array.
    NSArray *friendsInSection = [sectionsArray objectAtIndex:section];
    
    return [friendsInSection count];
}

//设置每行的cell的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    self.customTable = tableView;
    static NSString *CellIdentifier = @"Friends";
    
    UITableViewCell *cell = [self.customTable dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;

}
    
    // Get the time zone from the array associated with the section index in the sections array.
    NSArray *friendsInSection = [sectionsArray objectAtIndex:indexPath.section];
    
    // Configure the cell with the time zone's name.
    FriendsWrapper *friend = [friendsInSection objectAtIndex:indexPath.row];
    cell.textLabel.text = friend.localeName;
    
    return cell;
}

/*
 Section-related methods: Retrieve the section titles and section index titles from the collation.
 */

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
    UITableViewCell*cell =[self tableView:tableView cellForRowAtIndexPath:indexPath];
    
    return cell.frame.size.height;
}

//设置section的Header
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    
    //NSLog(@"%d",[[self.sectionsArray objectAtIndex:section]count]);
        if ([[self.sectionsArray objectAtIndex:section]count] == 0)
        {
         
            return nil;
        }

return [[collation sectionTitles] objectAtIndex:section];
}

//设置索引标题
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [collation sectionIndexTitles];
}

//关联搜索
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return [collation sectionForSectionIndexTitleAtIndex:index];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

#pragma mark -
#pragma mark Set the data array and configure the section data

- (void)setFriendsListArray:(NSMutableArray *)newDataArray {
    if (newDataArray != friendsListArray) {
        [friendsListArray release];
        friendsListArray = [newDataArray retain];
    }
    if (friendsListArray == nil) {
        self.sectionsArray = nil;
    }
    else {
        [self configureSections];
    }
}

- (void)configureSections {
    
    //获得当前UILocalizedIndexedCollation对象并且引用赋给collation
    self.collation = [UILocalizedIndexedCollation currentCollation];
    //获得索引数和section标题数
    NSInteger index, sectionTitlesCount = [[collation sectionTitles] count];
    
    NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];
    
    //设置sections数组:元素包含timezone
    for (index = 0; index < sectionTitlesCount; index++) {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [newSectionsArray addObject:array];
        [array release];
    }
    
    // Segregate the time zones into the appropriate arrays.
    for (FriendsWrapper *friend in friendsListArray) {
        
        //根据timezone的localename,获得对应的时区的section number
        NSInteger sectionNumber = [collation sectionForObject:friend collationStringSelector:@selector(localeName)];
        
        //获得section的数组
        NSMutableArray *sectionFriends = [newSectionsArray objectAtIndex:sectionNumber];
        
        //添加时区内容到section中 sectionTimeZones 存放的是所有的字符串
        [sectionFriends addObject:friend];
    }
    
    //排序
    for (index = 0; index < sectionTitlesCount; index++)
   
    {
        
        NSMutableArray *friendsListArrayForSection = [newSectionsArray objectAtIndex:index];
        
        //获得排序结果
        NSArray *sortedFriendsArrayForSection = [collation sortedArrayFromArray:friendsListArrayForSection collationStringSelector:@selector(localeName)];
        
        //替换原来数组
        [newSectionsArray replaceObjectAtIndex:index withObject:sortedFriendsArrayForSection];
    }
    
    self.sectionsArray = newSectionsArray;
    [newSectionsArray release];
}

#import "FriendsWrapper.h"

@implementation FriendsWrapper

@synthesize localeName;

- (id)initWithFriends:(NSString *)nameComponents
{
    
    if (self = [super init]) {
        
        NSString *name = nil;
        
        if ((nameComponents == nil) ||
            (nameComponents.length == 0)){
            
            name = @"";
        }else
        {
            name = nameComponents;
        }
        /*if ([nameComponents count] == 2) {
         name = [nameComponents objectAtIndex:1];
         }
         if ([nameComponents count] == 3) {
         name = [NSString stringWithFormat:@"%@ (%@)", [nameComponents objectAtIndex:2], [nameComponents objectAtIndex:1]];
         }*/
        
        localeName = [[name stringByReplacingOccurrencesOfString:@"_" withString:@" "] retain];
    }
    return self;
}

- (void)dealloc {
    [localeName release];    
    [super dealloc];
}

@end

uitableview中文排序问题的更多相关文章

  1. C++ sqlite3解决中文排序问题

    导言:sqlite3默认的编码方式为UTF8编码,而在UTF8编码下,中文不是按照拼音顺序编码的,所以想解决中文排序问题,必须自定义排序规则,将UTF8编码转换成GB2312编码(GB2312编码中文 ...

  2. Jquery datatable中文排序问题

    先扩展datatable的的排序功能,添加一个自定义排序函数 //为jq datatable 自定义中文排序 jQuery.fn.dataTableExt.oSort['chinese-sort-as ...

  3. Oracle的order by的中文排序问题

    Oracle 中查询结果按照某个中文字段或者英文字母(包括 符号)排序,并不会得到我们预期的结果,因为对于中文与英文字母及符号,Oracle实际是按照其对应的ASCII码值排序的! 可以看到按照中文村 ...

  4. Oracle中文排序问题

    默认感觉中文是按拼音排序,如果没实现效果,请加上其它排序,例如日期 表名为 dept ,其中name字段是中文,下面分别实现按照单位名称的笔划.部首和拼音排序.1: //按照笔划排序2: select ...

  5. oracle的中文排序问题

    mysql中文排序有convert(name using gbk)这样的函数,于是研究了一下oracle中文排序: 使用拼音排序 SQL> select * from chineseordert ...

  6. mysql中文排序问题

    mysql中文排序,用到的是: SELECT id id, billId billId, namespec nameSpec, unit unit, amount amount, price pric ...

  7. DB2 中文排序问题

    本地测试库中 代码集: GBK 数据库配置发行版级别 = 0x0c00 数据库发行版级别 = 0x0c00 数据库地域 = CN 数据库代码页 = 1386 数据库代码集 = GBK 数据库国家/地区 ...

  8. ExtJS4.2学习(四)Grid表格中文排序问题(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-07/173.html --------------- ...

  9. java中文排序问题(转)

    在Java中,对一个数组或列表(在本文中统称为集合)中的元素排序,是一个很经常的事情.好在Sun公司在Java库中实现了大部分功能.如果集合中的元素实现了Comparable接口,调用以下的静态(st ...

随机推荐

  1. HTTP认证之基本认证——Basic(一)

    导航 HTTP认证之基本认证--Basic(一) HTTP认证之基本认证--Basic(二) HTTP认证之摘要认证--Digest(一) HTTP认证之摘要认证--Digest(二) 一.概述 Ba ...

  2. SPOJ QTREE4 - Query on a tree IV 树分治

    题意: 给出一棵边带权的树,初始树上所有节点都是白色. 有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为0). 分析: ...

  3. day01_05.数学运算符

    数学运算符 $zhang = 100; $lisi = 50; echo $zhang+$lisi; 答案:150 $zhang = 50; $lisi = 40; echo $zhang - $li ...

  4. [linx学习篇] ssh远程服务器免密码

    第一步:生成密钥.在终端下执行命令: ssh-keygen -t rsa 一路回车,各种提示按默认不要改,等待执行完毕.然后执行: ls ~/.ssh #可以看到两个密钥文件:id_rsa(私钥) i ...

  5. [git 学习篇] 提交文件

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d ...

  6. Bootstrap-datepicker 用法

    <div class="input-group input-daterange"> <input type="text" id="s ...

  7. Linux Shell系列教程

    学习Linux Shell知识,就来Linux大学网(Linuxdaxue.com)! 本系列适合Linux初学者,属于Linux入门级教程,主要介绍了Shell的分类.语法格式以及脚本的使用和编写格 ...

  8. 刷题总结:排序机械臂(石室中学oj)(splay)

    题目: 题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到最低的物品位置 P1,并把从左起第 1 个至第 P1 个之间的物品反序 ...

  9. 网络流(自行理解的Dinic)

    自行理解的Dinic 注释即讲解 #include<bits/stdc++.h> ; using namespace std; int read() { ,w=; ;ch=getchar( ...

  10. Springboot 版本+ jdk 版本 + Maven 版本的匹配

    Spring boot 版本 Spring Framework jdk 版本 maven 版本 1.2.0 版本之前 6 3.0 1.2.0 4.1.3+ 6 3.2+ 1.2.1 4.1.3+ 7 ...