最终效果图:
方式1,用字典数组
BeyondViewController.h
// // BeyondViewController.h // 10_tableView // // Created by beyond on 14-7-25. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> @interface BeyondViewController : UIViewController @end
BeyondViewController.m
// // BeyondViewController.m // 10_tableView // // Created by beyond on 14-7-25. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "BeyondViewController.h" #define kHeader @"header" #define kFooter @"footer" #define kGirlsArr @"girls" @interface BeyondViewController ()<UITableViewDataSource> { // 假数据 NSArray *_array; } @end @implementation BeyondViewController - (void)viewDidLoad { [super viewDidLoad]; // 假数据 方式1 用字典 _array = @[ @{kHeader: @"十二钗正册", kGirlsArr:@[@"林黛玉",@"薛宝钗",@"贾元春",@"贾探春",@"史湘云",@"妙玉",@"贾迎春",@"贾惜春",@"王熙凤",@"贾巧姐",@"李纨",@"秦可卿"], kFooter:@"红楼梦" }, @{kHeader: @"十二钗副册", kGirlsArr:@[@"香菱",@"薛宝琴",@"尤二姐",@"尤三姐",@"邢岫烟",@"李纹",@"李绮",@"夏金桂",@"秋桐",@"小红",@"龄官",@"娇杏"], kFooter:@"红楼梦" }, @{kHeader: @"十二钗又副册", kGirlsArr:@[@"晴雯",@"袭人",@"平儿",@"鸳鸯",@"紫鹃",@"莺儿",@"玉钏",@"金钏",@"彩云",@"司棋",@"芳官",@"麝月"], kFooter:@"红楼梦" } ]; // 假数据 方式2 用类封装 // 样式只有两种 Grouped Plain UITableView *tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped]; // 数据源 tableView.dataSource = self; // 添加到self.view [self.view addSubview:tableView]; } // 数据源方法,特例,重要~ 一共有多少个分组 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return _array.count; } // 数据源方法,每一组,有多少行 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 返回数组中对应的字典的长度 return [[_array[section] objectForKey:kGirlsArr] count]; } // 数据源方法,每一组的每一行应该显示怎么的界面(含封装的数据),重点!!!必须实现否则,Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"Beyond"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if (cell == nil) { // 如果池中没取到,则重新生成一个cell /* cell的4种样式: 1,default 左图右文字 2,subtitle 左图 上文字大 下文字小 3,value 1 左图 左文字大 右文字小 3,value 2 恶心 左文字小 右文字大 */ cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; } // 设置cell中独一无二的内容 cell.textLabel.text = [_array[indexPath.section] objectForKey:kGirlsArr][indexPath.row]; // 返回cell return cell; } // 数据源方法,组的开头显示什么标题 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { return [_array[section] objectForKey:kHeader]; } // 数据源方法,,组的最后显示什么标题 //- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section //{ // return [_array[section] objectForKey:kFooter]; //} @end
方式2,用类(model)代替数组中的字典
TwelveBeauties.h
// // TwelveBeauties.h // 10_tableView // // Created by beyond on 14-7-26. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <Foundation/Foundation.h> // 对应 viewController.m中的成员数组中的一个成员 --> 字典 @interface TwelveBeauties : NSObject // UI控件连线时用weak,字符串用copy,其他对象用strong @property (nonatomic,copy) NSString *header; @property (nonatomic,copy) NSString *footer; @property (nonatomic,strong) NSArray *girls; // 提供一个类方法,一个以类名开头的构造方法(返回id亦可) + (TwelveBeauties *)twelveBeautiesWithHeader:(NSString *)header footer:(NSString *)footer girls:(NSArray *)girls; @end
TwelveBeauties.m
// // TwelveBeauties.m // 10_tableView // // Created by beyond on 14-7-26. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "TwelveBeauties.h" @implementation TwelveBeauties // 提供一个类方法,一个以类名开头的构造方法(返回id亦可) + (TwelveBeauties *)twelveBeautiesWithHeader:(NSString *)header footer:(NSString *)footer girls:(NSArray *)girls { TwelveBeauties *twelveBeauties = [[TwelveBeauties alloc]init]; twelveBeauties.header = header; twelveBeauties.footer = footer; twelveBeauties.girls = girls; return twelveBeauties; }@end
BeyondViewController.m
// // BeyondViewController.m // 10_tableView // // Created by beyond on 14-7-25. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "BeyondViewController.h" #import "TwelveBeauties.h" @interface BeyondViewController ()<UITableViewDataSource> { // 假数据 NSArray *_array; } @end @implementation BeyondViewController - (void)viewDidLoad { [super viewDidLoad]; // 假数据 方式1 用字典 /* _array = @[ @{kHeader: @"十二钗正册", kGirlsArr:@[@"林黛玉",@"薛宝钗",@"贾元春",@"贾探春",@"史湘云",@"妙玉",@"贾迎春",@"贾惜春",@"王熙凤",@"贾巧姐",@"李纨",@"秦可卿"], kFooter:@"红楼梦" }, @{kHeader: @"十二钗副册", kGirlsArr:@[@"香菱",@"薛宝琴",@"尤二姐",@"尤三姐",@"邢岫烟",@"李纹",@"李绮",@"夏金桂",@"秋桐",@"小红",@"龄官",@"娇杏"], kFooter:@"红楼梦" }, @{kHeader: @"十二钗又副册", kGirlsArr:@[@"晴雯",@"袭人",@"平儿",@"鸳鸯",@"紫鹃",@"莺儿",@"玉钏",@"金钏",@"彩云",@"司棋",@"芳官",@"麝月"], kFooter:@"红楼梦" } ]; */ // 假数据 方式2 用类封装后 _array = @[ [TwelveBeauties twelveBeautiesWithHeader:@"十二钗正册" footer:@"红楼梦" girls:@[">@"林黛玉",@"薛宝钗",@"贾元春",@"贾探春",@"史湘云",@"妙玉",@"贾迎春",@"贾惜春",@"王熙凤",@"贾巧姐",@"李纨",@"秦可卿"]], [TwelveBeauties twelveBeautiesWithHeader:@"十二钗副册" footer:@"红楼梦" girls:@[@"香菱",@"薛宝琴",@"尤二姐",@"尤三姐",@"邢岫烟",@"李纹",@"李绮",@"夏金桂",@"秋桐",@"小红",@"龄官",@"娇杏"]], [TwelveBeauties twelveBeautiesWithHeader:@"十二钗又副册" footer:@"红楼梦" girls:@[@"晴雯",@"袭人",@"平儿",@"鸳鸯",@"紫鹃",@"莺儿",@"玉钏",@"金钏",@"彩云",@"司棋",@"芳官",@"麝月"]] ]; // 样式只有两种 Grouped Plain UITableView *tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped]; // 数据源 tableView.dataSource = self; // 添加到self.view [self.view addSubview:tableView]; } // 数据源方法,特例,重要~ 一共有多少个分组 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return _array.count; } // 数据源方法,每一组,有多少行 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 返回数组中对应的字典的长度 // return [[_array[section] objectForKey:kGirlsArr] count]; // 用数据模型封装后 TwelveBeauties *twelveBeauties = _array[section]; return twelveBeauties.girls.count; } // 数据源方法,每一组的每一行应该显示怎么的界面(含封装的数据),重点!!!必须实现否则,Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"Beyond"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if (cell == nil) { // 如果池中没取到,则重新生成一个cell /* cell的4种样式: 1,default 左图右文字 2,subtitle 左图 上文字大 下文字小 3,value 1 左图 左文字大 右文字小 3,value 2 恶心 左文字小 右文字大 */ cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; } // 设置cell中独一无二的内容,字典封装假数据 //cell.textLabel.text = [_array[indexPath.section] objectForKey:kGirlsArr][indexPath.row]; // 用数据模型封装后 TwelveBeauties *twelveBeauties = _array[indexPath.section]; cell.textLabel.text = [twelveBeauties.girls objectAtIndex:indexPath.row] ; // 返回cell return cell; } // 数据源方法,组的开头显示什么标题 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { // 字典封装假数据 // return [_array[section] objectForKey:kHeader]; // 用数据模型封装后 TwelveBeauties *twelveBeauties = _array[section]; return twelveBeauties.header; } // 数据源方法,组的索引的标题(通讯录最右边的竖条) -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { // 用KVC \ KVO 可以一句代码实现 return @[@"正册",@"副册",@"又副册"] ; // NSMutableArray *array = [NSMutableArray array]; // for (TwelveBeauties *tb in _array) { // [array addObject:tb.header]; // } // NSLog(@"%@",array); // return array; } @end