我们可以采用名字分段法,名字分段会在之后的小节中显示,这是转而使用球员的角色分段发,以最直接的入手点讲解好UITableView的分段使用方法。本节示例时基于上节的SimpleTableViewController可以作为这里的父类,创建一个名为SectionTableViewController的类,继承自SimpleTableViewController,头文件声明如下:

#import "HBSimpleTableViewController.h"

@interface HBSectionTableViewController : HBSimpleTableViewController

@end

随后有必要对数据源的制作进行改善,使其变成分角色的类别

-(void)initData
{
//承认SimpleTableView中的数据源有效性
[super initData]; //最终的新数据源
NSMutableArray *arrSectionDatasource=[NSMutableArray arrayWithCapacity:];
//记录着当前已经使用的段名
NSMutableArray *arrSection = [NSMutableArray arrayWithCapacity:];
//临时存放一个段名下的所有球员对象
NSMutableArray *arrTmp = [NSMutableArray arrayWithCapacity:]; //对于所有球员进行遍历
for (HBPlayerInfo *onePlayer in self.datasource) {
NSString *role=onePlayer.role;
//如果当前球员的role已经被作为段名只做好,则continue
//也意味着当前球员已经被加入到最终数据源中
if([arrSection containsObject:role])
{
continue;
} //新的role
//再次遍历球员
for (HBPlayerInfo *rolePlayer in self.datasource) {
if([rolePlayer.role isEqualToString:role])
{
[arrTmp addObject:rolePlayer];
}
} //此role被作为一个段名,制作完成
[arrSection addObject:role]; //arrTmp中包含着所有满足当前role段名的球员对象
//加到最终的数据源中
[arrSectionDatasource addObject:arrTmp]; //重置arrTmp
//等待新的role将所有满足的球员对象加进来
arrTmp=[NSMutableArray arrayWithCapacity:];
} //重置数据源
if (_datasource) {
_datasource=nil;
}
_datasource=[[NSArray alloc] initWithArray:arrSectionDatasource];
}

(1)告诉UITableView一共分成几段,之前SimpleTableViewController没有实现此方法,所以默认的时一段,多段的代码如下:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return self.datasource.count;
}

(2)告诉UITableView每段的段名。由于每个子数组中元素的role内容都相同,可以取第一个元素访问

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
HBPlayerInfo *onePlay=[((NSArray *)[self.datasource objectAtIndex:section]) objectAtIndex:];
return onePlay.role;
}

表视图“行制作”回调函数重新访问新数据源,修改如下

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return ((NSArray *)[self.datasource objectAtIndex:section]).count;
} -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier=@"sectionTableViewCellId";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil)
{
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
} //取得每个球员的方法和SimpleTableViewController有所不同
HBPlayerInfo *onePlayer=nil;
NSArray *arrSectionPlayer=[self.datasource objectAtIndex:indexPath.section];
if(arrSectionPlayer && arrSectionPlayer.count>indexPath.row)
{
onePlayer =[arrSectionPlayer objectAtIndex:indexPath.row];
}
if (onePlayer) {
cell.textLabel.text=onePlayer.name;
}
return cell;
}

程序运行效果如下:

IOS 表视图(UITableVIew)的使用方法(2)名单的分段显示的更多相关文章

  1. IOS 表视图(UITableVIew)的使用方法(3)名单的索引显示

    当数据量特别大时,简单地以role进行分段,对实际查找的效率提升并不大.就像上一节开头所说,开发者可以根据球员名字的首字母进行分段,且分成26段.由于段数较多,可以使用UITableView的索引机制 ...

  2. IOS 表视图(UITableVIew)的使用方法(6)表视图的编辑功能(新增Add)

    表视图的新增功能和删除功能虽然目的不同,但是工作流程是相似的 下面列出在处理新增的回调函数时,与删除所不同的逻辑部分代码. 显示下过如下: #pragma mark #pragma mark Tabl ...

  3. iOS 表视图(UITableVIew)的使用方法(1)表视图的示例

    表视图继承自UIScrollView,所以有着大多UIScrollView的操作特性,诸如手指控制内容的滚动,内容视图到顶端或者低端时的自动反弹等.配合UINavigationController的导 ...

  4. IOS 表视图(UITableVIew)的使用方法(8)表视图的编辑功能(多选)

    在表视图的删除操作中,每次只能够对其中一个单元进行删除,如果想要同时删除多条记录,不得不挨个地进行标准的删除操作 所以如果能够实现多选的机制,无论是删除还是其他功能的嫁接,都会变得更加方便 当UITa ...

  5. IOS 表视图(UITableVIew)的使用方法(5)表视图的编辑功能(删除)

    默认的,如果表视图支持编辑,那用户可以通过两种方式来删除某些行,其一为单击左侧的红色按钮后行右侧显示“Delete”按钮,其二为在单元行上的手指向左滑动,“Delete”按钮也会出现供用户单击.无论哪 ...

  6. IOS 表视图(UITableVIew)的使用方法(7)表视图的编辑功能(拖拉调整排序位置)

    除了每个单元行左边的删除和新增图标,UITableView还支持在单元行的右侧显示一个供用户拖拉调整排序位置的控件. 不过如果要显示此控件,UITableView的数据源需要实现以下的方法. -(vo ...

  7. IOS 表视图(UITableVIew)的使用方法(4)自定义表视图单元

    UITableViewCell的自定义往往需要自建一个UITableViewCell的子类后进行作业.开发者可以选择通过xib或者直接在UITableViewCell的布局中进行UITableView ...

  8. IOS 表视图UITableView 束NSBundle

    今天搞了一下表视图UITableView 表视图是在以后应用程序开发中经常用到的一个视图,所以必须要熟练掌握 所获不多,对视图有了一个大概的了解 其中有用到NSBundle , 束   这个类 先说一 ...

  9. IOS开发之表视图(UITableView)

    IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于 ...

随机推荐

  1. android 三级菜单 BaseExpandableListAdapter

    在网上搜了非常长时间.没有找到合适的Android三级菜单.所以就自己动手写了一个,主要使用了BaseExpandableList来实现,通过三个布局文件来完毕相应的菜单项,详细实现请參照下图. wa ...

  2. JQ工具函数运用

    1.把对象转换为字符串 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <he ...

  3. 在WHERE子句中引用取别名的列

    版权说明:作者:张颖希(PocketZ's Blog)出处:http://www.cnblogs.com/PocketZ本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页 ...

  4. DataTable去除重复行

    //抽取dt中的特定列"Region","Cur","Year"组合成新的dat DataTable dat = dt.DefaultVie ...

  5. wcf xml消息客户端cookie

    public override bool Login(string userName, string password) { using (HttpClient client = new HttpCl ...

  6. Struts2相关注意点

    今天开始学习Struts2,有一个小栗子用到了DMI动态方法调用,使用DMI可以减少action的数量简化程序,不用在struts.xml的action中定义method属性.刚开始怎么也不能使用DM ...

  7. .Net页面缓存OutPutCachexian详解

    一 它在Web.Config中的位置 <system.web> <!--页面缓存--> <caching> <outputCacheSettings> ...

  8. 浏览器 HTTP 缓存原理分析

    转自:http://www.cnblogs.com/tzyy/p/4908165.html 浏览器缓存原理: 1.浏览器第一次访问服务器资源/index.html,在浏览器中没有缓存文件,直接向服务器 ...

  9. HTTP 错误 401.3 - Unauthorized由于 Web 服务器上此资源的访问控制列表(ACL)解决办法

    对应站点目录的IUSR的权限没设造成的...在属性——>安全——> 高级 中把IUSR用户找出来添加好就OK了 注:IUSR(匿名访问 Internet 信息服务的内置帐户)

  10. egret命令行编译项目时 版本不对应的问题

    egret 命令行编译项目时 如使用 egret build -e 会出现版本不对应的问题 分析原因 A,B项目 A项目使用1.8的egret引擎, B项目使用2.5引擎 但本地引擎升级至2.5.5, ...