表视图用于显示数据列表。 表视图限制- –支持多行,但只有一列(tableView是为手持设备所设计)
两种类型:style
a 分组表---如微博视图等效果
b 无格式表,平铺型(Plain)---如系统自带的设置效果
eg:
//创建UITableView,两种类型UITableViewStylePlain
UITableViewStyleGrouped
UITableView *myTable = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
myTable.delegate = self; //获取外观数据
myTable.dataSource = self; //获得内容数据
[self.view addSubview:myTable];
[myTable release];
在.h中提供协议,表视图是个空容器
<UITableViewDataSource,UITabBarDelegate>
eg:Section分区: 表中的每一个组
//设置包含的section分区
-(NSInteger)numberOfSectionsInTableView: (UITableView *)tableView
{
return 分区数;
}
Row行:为基本单位
//设置section的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 行数;
}
单元格--单元格为基本元素,填充内容数据
//设置单元格的内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//标记符,用来标记创建的cell
static NSString *cellstr = @"cell";
UITableViewCell *cell = [tableView dequeueReusableHeaderFooterViewWithIdentifier:cellstr];
//根据复用标示获取复用的单元格对象
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellstr];
}
//创建单元格,类型
* UITableViewCellStyleSubtitle--显示:图片--文本-
detailTextLabel(位置正下方)
* UITableViewCellStyleDefault--显示:图片-文本
* UITableViewCellStyleValue1-- 显示:图片-文本-detailTextLabel(位置加后面)
* UITableViewCellStyleValue2--显示:detailTextLabel(位置加前面)-图片-文本
* //设置字体的大小
cell.textLabel.font = [UIFont boldSystemFontOfSize:字体大小];
cell.textLabel.text = @“文本”;
cell.imageView.image = [UIImage imageNamed:@“图片”];
cell.detailTextLabel.text = @“详情文本”;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
// UITableViewCellAccessoryDetailDisclosureButton--- >
UITableViewCellAccessoryCheckmark ----------打勾
UITableViewCellAccessoryDisclosureIndicator ----->
UITableViewCellAccessoryNone --------------空
//
//字典的显示方法
NSArray *keys = [self.dict allKeys];
NSArray *temp = [keys sortedArrayUsingSelector:@selector(compare:)];
NSString *keyString = temp[indexPath.section];
NSArray *values = [self.dict objectForKey:keyString];
cell.textLabel.text = values[indexPath.row];
//
return cell;
}
//设置行的高度: heightForRow……………….
//设置section,Header,Footer
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return 头文字;
}
//设置是否可以编辑
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
//单元格点击事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
//设置缩进级别
-(NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 整数;
}
创建单选的基本原理
创建一个NSIndexPath属性,记录当前选中行的IndexPath
判断要显示的行是否与当前的选中行是同一行。若是,则选中;若否,则不选中
单击某行时更改属性的值,并且刷新有关行
定制表视图单元格
1.单元格创建时定制:
eg:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
//定制单元格
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 5, 80, 120)];
imageView.tag = 11;
[cell.contentView addSubview:imageView];
[imageView release];
}
UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:11];
imageView.image = 数据源;
return cell;
}
2.使用UITabelViewCell子类进行定制:
创建类继承于UITableViewCell,
eg:在类中重新初始化单元格,假设类名为MyCell
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//定制单元格
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 5, 80, 120)];
imageView.tag = 11;
[self.contentView addSubview:imageView];
self.portraitView = imageView;
[imageView release];
}
return self;
}
//------------------//
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
MyCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell)
{
cell = [[MyCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
return cell;
}
3.使用Nib文件进行定制:
创建User Interface -- Empty--拉一个表视图单元格--初始化单元格内容(CustomCell.xib)
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier”; //设置自定义表视图单元格的身份,在属性:
static BOOL isRegister = NO;
if(!isRegister)
{
UINib *nib = [UINib nibWithNibName:@“CustomCell” bundle:[NSBundle mainBundle]];
[tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];
isRegister = YES;
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:11];
imageView.image = 数据源;
return cell;
}
4.数据绑定原则:
5.结合使用:
表视图的数据编辑
1.表视图的编辑状态:
// 创建按钮表示是否进入编辑:
-(void)editButtonPressed
{
[self.tableView setEditing:!self.tableView.editing animated:YES];
}
//设置编辑状态
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete;
//
UITableViewCellEditingStyleDelete //默认--编辑风格--删除
UITableViewCellEditingStyleInsert //添加
UITableViewCellEditingStyleNone
UITableViewCellEditingStyleDelete|UITableViewCellEditingStyleInsert
//
}
2.插入:
//指定编辑风格UITableViewCellEditingStyleInsert
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
//可弹到另一页面指定详细信息,这里写死
Student *stuToInsert = [[Student alloc]init];
stuToInsert.name = @"新添加的行";
[self.list insertObject:stuToInsert atIndex:indexPath.row];
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
3.删除:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{ //因执行插入操作时也会触发该方法,if判断是否删除
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self.list removeObjectAtIndex:indexPath.row]; //删除数组
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; //刷新
}
}
4.实现表视图数据的移动:
//实现表视图的移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
NSUInteger fromRow = sourceIndexPath.row;//要移动的行
NSUInteger toRow = destinationIndexPath.row;//接受插入的行
id object = [self.list objectAtIndex:fromRow];
[self.list removeObjectAtIndex:fromRow];
[self.list insertObject:object atIndex:toRow];
}
5.实现表视图数据的修改:(委托方法实现)
表视图的索引,索引是基于分组数据的
字母索引的实现:
eg:
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return self.keys;//所有组的标题放到数组中,做为返回值,这些标题将成为创建索引的依据
}
汉字索引的实现:
eg:
//创建26个可变数组
NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
for (char character = 'a'; character <= 'z'; character++)
{
NSMutableArray *array = [[NSMutableArray alloc]init];
[dic setObject:array forKey:[NSString stringWithFormat:@"%c",character]];
[array release];
[self.keys addObject:[NSString stringWithFormat:@"%c",character]];
}
//将没有数据的首字母去掉
for (char character = 'a'; character <= 'z'; character++) {
NSString *key = [NSString stringWithFormat:@"%c",character];
NSArray *array = [dic objectForKey:key];
if (!array.count) {
[dic removeObjectForKey:key];
}
}
//将字典中的对象排序后赋值给数组
self.mArray = [dic.allKeys sortedArrayUsingSelector:@selector(compare:)];
//从数组中遍历数组对象
for (NSString *city in cities) {
//从数组对象中获取首字符串的首字母拼音
NSString *initial = [NSString stringWithFormat:@"%c",pinyinFirstLetter([city characterAtIndex:0])];
//通过字典的健值获取其对象
NSMutableArray *array = [dic objectForKey:initial];
//可变数组没有分配空间,而是和字典公用一块空间,而可变数组只是相应字典对象的别名
[array addObject:city];
}
//将创建的字母系列放在表视图的右边区
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return self.keys;
}
注意:开启图片点击事件:
eg:self.myHead.userInteractionEnabled=YES;//开启图片点击,myHead是imageView的图片
//创建单击手势
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(xt:)];
//给图片添加单击手势
[self.myHead addGestureRecognizer:tap];
设置代理<UIImagePickerControllerDelegate>
-(void) xt:(id)sender{
UIImagePickerController *img=[[UIImagePickerController alloc]init];//图片加载
//检查用户是否有相片库
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { img.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; //现有的图片库
img.delegate=self;
[self presentViewController:img animated:YES completion:nil];//推出了图像选择视图
}
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
UIImage *temp=[info objectForKey:UIImagePickerControllerOriginalImage];
self.myHead.image=temp;
//收起视图
[picker dismissViewControllerAnimated:YES completion:nil];
}
两种类型:style
a 分组表---如微博视图等效果
b 无格式表,平铺型(Plain)---如系统自带的设置效果
eg:
//创建UITableView,两种类型UITableViewStylePlain
UITableViewStyleGrouped
UITableView *myTable = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
myTable.delegate = self; //获取外观数据
myTable.dataSource = self; //获得内容数据
[self.view addSubview:myTable];
[myTable release];
在.h中提供协议,表视图是个空容器
<UITableViewDataSource,UITabBarDelegate>
eg:Section分区: 表中的每一个组
//设置包含的section分区
-(NSInteger)numberOfSectionsInTableView: (UITableView *)tableView
{
return 分区数;
}
Row行:为基本单位
//设置section的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 行数;
}
单元格--单元格为基本元素,填充内容数据
//设置单元格的内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//标记符,用来标记创建的cell
static NSString *cellstr = @"cell";
UITableViewCell *cell = [tableView dequeueReusableHeaderFooterViewWithIdentifier:cellstr];
//根据复用标示获取复用的单元格对象
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellstr];
}
//创建单元格,类型
* UITableViewCellStyleSubtitle--显示:图片--文本-
detailTextLabel(位置正下方)
* UITableViewCellStyleDefault--显示:图片-文本
* UITableViewCellStyleValue1-- 显示:图片-文本-detailTextLabel(位置加后面)
* UITableViewCellStyleValue2--显示:detailTextLabel(位置加前面)-图片-文本
* //设置字体的大小
cell.textLabel.font = [UIFont boldSystemFontOfSize:字体大小];
cell.textLabel.text = @“文本”;
cell.imageView.image = [UIImage imageNamed:@“图片”];
cell.detailTextLabel.text = @“详情文本”;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
// UITableViewCellAccessoryDetailDisclosureButton--- >
UITableViewCellAccessoryCheckmark ----------打勾
UITableViewCellAccessoryDisclosureIndicator ----->
UITableViewCellAccessoryNone --------------空
//
//字典的显示方法
NSArray *keys = [self.dict allKeys];
NSArray *temp = [keys sortedArrayUsingSelector:@selector(compare:)];
NSString *keyString = temp[indexPath.section];
NSArray *values = [self.dict objectForKey:keyString];
cell.textLabel.text = values[indexPath.row];
//
return cell;
}
//设置行的高度: heightForRow……………….
//设置section,Header,Footer
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return 头文字;
}
//设置是否可以编辑
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
//单元格点击事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
//设置缩进级别
-(NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 整数;
}
创建单选的基本原理
创建一个NSIndexPath属性,记录当前选中行的IndexPath
判断要显示的行是否与当前的选中行是同一行。若是,则选中;若否,则不选中
单击某行时更改属性的值,并且刷新有关行
定制表视图单元格
1.单元格创建时定制:
eg:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
//定制单元格
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 5, 80, 120)];
imageView.tag = 11;
[cell.contentView addSubview:imageView];
[imageView release];
}
UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:11];
imageView.image = 数据源;
return cell;
}
2.使用UITabelViewCell子类进行定制:
创建类继承于UITableViewCell,
eg:在类中重新初始化单元格,假设类名为MyCell
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//定制单元格
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 5, 80, 120)];
imageView.tag = 11;
[self.contentView addSubview:imageView];
self.portraitView = imageView;
[imageView release];
}
return self;
}
//------------------//
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
MyCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell)
{
cell = [[MyCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
return cell;
}
3.使用Nib文件进行定制:
创建User Interface -- Empty--拉一个表视图单元格--初始化单元格内容(CustomCell.xib)
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier”; //设置自定义表视图单元格的身份,在属性:
static BOOL isRegister = NO;
if(!isRegister)
{
UINib *nib = [UINib nibWithNibName:@“CustomCell” bundle:[NSBundle mainBundle]];
[tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];
isRegister = YES;
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:11];
imageView.image = 数据源;
return cell;
}
4.数据绑定原则:
5.结合使用:
表视图的数据编辑
1.表视图的编辑状态:
// 创建按钮表示是否进入编辑:
-(void)editButtonPressed
{
[self.tableView setEditing:!self.tableView.editing animated:YES];
}
//设置编辑状态
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete;
//
UITableViewCellEditingStyleDelete //默认--编辑风格--删除
UITableViewCellEditingStyleInsert //添加
UITableViewCellEditingStyleNone
UITableViewCellEditingStyleDelete|UITableViewCellEditingStyleInsert
//
}
2.插入:
//指定编辑风格UITableViewCellEditingStyleInsert
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
//可弹到另一页面指定详细信息,这里写死
Student *stuToInsert = [[Student alloc]init];
stuToInsert.name = @"新添加的行";
[self.list insertObject:stuToInsert atIndex:indexPath.row];
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
3.删除:
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{ //因执行插入操作时也会触发该方法,if判断是否删除
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self.list removeObjectAtIndex:indexPath.row]; //删除数组
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; //刷新
}
}
4.实现表视图数据的移动:
//实现表视图的移动
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
NSUInteger fromRow = sourceIndexPath.row;//要移动的行
NSUInteger toRow = destinationIndexPath.row;//接受插入的行
id object = [self.list objectAtIndex:fromRow];
[self.list removeObjectAtIndex:fromRow];
[self.list insertObject:object atIndex:toRow];
}
5.实现表视图数据的修改:(委托方法实现)
表视图的索引,索引是基于分组数据的
字母索引的实现:
eg:
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return self.keys;//所有组的标题放到数组中,做为返回值,这些标题将成为创建索引的依据
}
汉字索引的实现:
eg:
//创建26个可变数组
NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
for (char character = 'a'; character <= 'z'; character++)
{
NSMutableArray *array = [[NSMutableArray alloc]init];
[dic setObject:array forKey:[NSString stringWithFormat:@"%c",character]];
[array release];
[self.keys addObject:[NSString stringWithFormat:@"%c",character]];
}
//将没有数据的首字母去掉
for (char character = 'a'; character <= 'z'; character++) {
NSString *key = [NSString stringWithFormat:@"%c",character];
NSArray *array = [dic objectForKey:key];
if (!array.count) {
[dic removeObjectForKey:key];
}
}
//将字典中的对象排序后赋值给数组
self.mArray = [dic.allKeys sortedArrayUsingSelector:@selector(compare:)];
//从数组中遍历数组对象
for (NSString *city in cities) {
//从数组对象中获取首字符串的首字母拼音
NSString *initial = [NSString stringWithFormat:@"%c",pinyinFirstLetter([city characterAtIndex:0])];
//通过字典的健值获取其对象
NSMutableArray *array = [dic objectForKey:initial];
//可变数组没有分配空间,而是和字典公用一块空间,而可变数组只是相应字典对象的别名
[array addObject:city];
}
//将创建的字母系列放在表视图的右边区
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
return self.keys;
}
注意:开启图片点击事件:
eg:self.myHead.userInteractionEnabled=YES;//开启图片点击,myHead是imageView的图片
//创建单击手势
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(xt:)];
//给图片添加单击手势
[self.myHead addGestureRecognizer:tap];
设置代理<UIImagePickerControllerDelegate>
-(void) xt:(id)sender{
UIImagePickerController *img=[[UIImagePickerController alloc]init];//图片加载
//检查用户是否有相片库
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { img.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; //现有的图片库
img.delegate=self;
[self presentViewController:img animated:YES completion:nil];//推出了图像选择视图
}
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
UIImage *temp=[info objectForKey:UIImagePickerControllerOriginalImage];
self.myHead.image=temp;
//收起视图
[picker dismissViewControllerAnimated:YES completion:nil];
}