文档章节

iOS开发16:分组的表格

双子座
 双子座
发布于 2012/04/08 18:26
字数 743
阅读 5681
收藏 13

前面两篇文章讲了表格的简单使用,不过却并没有分组。为了做一个有分组的表格,我想到了树形结构的数据。记得前边在介绍Picker控件时,曾经使用过我国部分省市名称的信息,这里,我们再次使用那个信息。在那篇文章已经建好了一个plist文件,所以后面我们会直接将该文件拖放到新工程中。在文章的最后会将代码上传。

我们做的分组表格效果如下图:

1、运行Xcode 4.2,新建一个Single View Application,名称为Grouped Table:

2、单击ViewController.xib,使用Interface Builder给视图添加一个UITableView控件,并使其覆盖整个视图:

3、选中新添加的UITableView控件,打开Connection Inspector,找到delegate和datasource,从它们右边的圆圈拉线到Files Owner图标:

4、将之前用过的provinceCities.plist文件拖到当前工程中,并选中“Copy…”选项。

5、打开ViewController.h,添加代码:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@property (strong, nonatomic) NSDictionary *provinceCities;
@property (strong, nonatomic) NSArray *provinces;

@end

6、打开ViewController.m,向其中添加代码:

6.1 在@implementation下面添加代码:

@synthesize provinces;
@synthesize provinceCities;

6.2 在ViewDidLoad方法中添加代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *plistURL = [bundle URLForResource:@"provinceCities" withExtension:@"plist"];
    
    NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:plistURL];
    self.provinceCities = dictionary;
    NSArray *keys = [self.provinceCities allKeys];
    self.provinces = keys;
}

6.3 在ViewDidUnload方法中添加代码:

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.provinceCities = nil;
    self.provinces = nil;
}

6.4 在@end之前添加代码:

#pragma mark - 
#pragma mark Table View Data Source Methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    //这个方法用来告诉表格有几个分组
    return [provinces count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    //这个方法告诉表格第section个分组有多少行
    NSString *key = [provinces objectAtIndex:section];
    NSArray *cities = [provinceCities objectForKey:key];
    return [cities count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //这个方法用来告诉某个分组的某一行是什么数据,返回一个UITableViewCell
    NSUInteger section = [indexPath section];
    NSUInteger row = [indexPath row];
    //获取这个分组的省份名称
    NSString *key = [provinces objectAtIndex:section];
    //根据省份名称获得这个省份的城市列表
    NSArray *cities = [provinceCities objectForKey:key];
    
    static NSString *GroupedTableIdentifier = @"GroupedTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             GroupedTableIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:GroupedTableIdentifier];
    }
    
    cell.textLabel.text = [cities objectAtIndex:row];
    return cell;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    //这个方法用来告诉表格第section分组的名称
    NSString *key = [provinces objectAtIndex:section];
    return key;
}

7、运行,效果如下图左:

  

8、现在关闭模拟器,打开ViewController.xib,选中Table View控件,打开Attribute Inspector,设置其Style为Grouped:

然后再运行,效果如上图右。

9、可是,数据很多,想找到一个城市可能要花很长时间。为此,我们添加标签。标签将会在右侧显示,每个标签对应一个省份。单击一个标签就可以快速跳到那个省份的数据。

打开ViewController.m,在@end之前添加代码:

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

运行:

工程代码:http://www.oschina.net/code/snippet_164134_9782

 

© 著作权归作者所有

双子座
粉丝 540
博文 78
码字总数 61009
作品 0
南京
程序员
私信 提问
加载中

评论(10)

艾欧艾斯
艾欧艾斯

引用来自“CandyDy”的评论

引用来自“艾欧艾斯”的评论

引用来自“双子座”的评论

引用来自“崔毅”的评论

挺好的,不过 cellForRowAtIndexPath 那有个内存泄漏

具体是哪呢?

if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:GroupedTableIdentifier];

新建工程的时候使用了自动引用计数了,所以不会泄露的吧

一直没用arc 不清楚
C
CandyDy

引用来自“艾欧艾斯”的评论

引用来自“双子座”的评论

引用来自“崔毅”的评论

挺好的,不过 cellForRowAtIndexPath 那有个内存泄漏

具体是哪呢?

if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:GroupedTableIdentifier];

新建工程的时候使用了自动引用计数了,所以不会泄露的吧
艾欧艾斯
艾欧艾斯

引用来自“双子座”的评论

引用来自“崔毅”的评论

挺好的,不过 cellForRowAtIndexPath 那有个内存泄漏

具体是哪呢?

if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:GroupedTableIdentifier];
chaseshu
chaseshu
good!
z
zk0301
多了个分组的功能,不错,android里面要这么实现费劲,下一篇 冲啊
1
135kp
经常看到一些控件要拉delegate和datasource这两条线的,有的又不用,到底什么时候要拉什么时候不要拉。。
某屌司
樓主威武,謝謝啦!
不愿透露姓名的Mr成
不愿透露姓名的Mr成
为什么我拖放控件的时候,怎么覆盖不了呢?这是为什么呢?
双子座
双子座 博主

引用来自“崔毅”的评论

挺好的,不过 cellForRowAtIndexPath 那有个内存泄漏

具体是哪呢?
崔毅
挺好的,不过 cellForRowAtIndexPath 那有个内存泄漏
IOS软件开发视频教程要的来

IPhone开发实战视频教程内容介绍 1.iPhone开发实战视频教程-iOS开发视频教程 介绍了iPhone开发的开发环境iOS SDK,X-Code,Interface Builder,iTunes等;创建项目的基本步骤,项目工程中文件...

三毛钱
2016/07/09
251
3
(转)直接拿来用!最火的iOS开源项目(一)

AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目。AFNetworking是一个轻量级的iOS、Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库。它建立在...

孙启超
2013/06/21
3.8K
0
(转)直接拿来用!最火的iOS开源项目(二)

“每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x到如今的iOS 7,有的项目...

孙启超
2013/06/21
3.9K
1
区块链游戏独角兽,殿堂级的投资项目:Cocos-BCX

区块链游戏独角兽,殿堂级的投资项目:Cocos-BCX 2018-11-08 16:20编辑: suiling分类:区块链来源:Cocos-BCX 技术Cocos-BCX区块链 招聘信息: 图像处理及模式识别工程师 C/C++工程师 Coco...

suiling
2018/11/08
0
0
HDU ~ 6297 ~ CCPC直播 (模拟,输出格式控制)

思路:模拟就行了,注意Running和RTE的开头字母一样。 iomanip是I/O流控制头文件,就像printf的格式化输出一样。 以下是一些常用的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oc...

zscdst
2018/05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

灵光一闪来个科普贴:Linux文件系统

在计算机系统中,各种需要保存的信息都是以文件的形式存在的。文件管理是对系统信息资源的管理,是操作系统的一项重要功能。 1.文件与文件系统: 1.1文件: 文件是具有名字的一组相关信息的有...

Linux就该这么学
3分钟前
1
0
ExtJS 4.2 评分组件

本文转载于:专业的前端网站➸ExtJS 4.2 评分组件 上一文章是扩展ExtJS自带的Date组件。在这里将创建一个评分组件。 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2...

前端老手
6分钟前
2
0
如何为视频添加封面?

一个好的视频封面可以吸引观众的眼球,从而起到事半功倍的宣传效果,但是很多小伙伴并不知道怎么给视频添加封面。下面分享一个制作封面否方法,操作起来也比较简单的,有兴趣的小伙伴请接着往...

白米稀饭2019
16分钟前
2
0
如何使用soapUI模拟webservice客户端发送请求

参考资料 https://jingyan.baidu.com/article/cbcede0712849a02f40b4d88.html 左边是请求参数,可以自己填写!按着那个绿色三角箭头可以模拟发送请求,右边是返回的报文 soapui如何发送xml格...

故久呵呵
45分钟前
5
0
Java Security 介绍

1.介绍 Java平台设计的重点是安全性。在其核心,java语言本身是类型安全的并且提供了垃圾自动回收,这使其增加了应用程序代码的健壮性。安全的类加载以及验证机制确保了只有合法的代码才能够...

lixiaobao
51分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部