UITableView(表视图)使用详解

基本属性


//创建一个表视图 并设置frame和样式 系统提供了两种tableView样式 Grouped和Plain Grouped样式区头不会移出界面外但区脚无法隐藏
UITableView *tab =[[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 480) style:UITableViewStyleGrouped];
//tableView代理和数据源 tableView提供了很多的代理和数据源方法 其中有两个必选方法 下面会详细讲解
tab.delegate =self;
tab.dataSource =self;
//为table设置表头 可以是任意的ui视图,改变view的frame有效 仅仅设置一个 需要设置多个请用代理方法
tab.tableHeaderView = view;
//设置分割线的颜色
tab.separatorColor = [UIColor blueColor];
//设置编辑状态
tab.editing = YES;
//设置分割线与左右的间距
tab.separatorInset = UIEdgeInsetsMake(0, 50, 0, 50);
//属性设置就列举这些吧,tableView的很多属性都有两种设置方式 一种是普通方法直接赋值还一种就是使用代理方法和数据源方法设置,使用代理和数据源方式设置的属性可以使用下面的方法进行刷新
[tab reloadData];
代理方法和数据源方法的刷新顺序(感谢大圣的测试):
返回区数方法仅执行一次 —>
执行区头的高度———>
执行区头(有多少个区就会执行多少次)————>
每个区中返回多少行(有多少个区执行多少次)——————>
返回每一个单元格 (执行次数为区数*行数).

必选方法:

1.

//设定tableView的行数,提供一个tableView参数和section参数,第一个参数可以用来判断是那个tableView调用的 第二个参数表示当前所在的区 有几个区此方法调用几次
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    return zuArray.count;//但个区以数组下标来确定每个区的行数
    //两个区 第一个区返回2行 第二个区返回5行
    if (section == 0) {
        return 2;
    }else{
        return 5;
    }
    //使用多维数组动态设置每个区多少行
    return [[zuArray objectAtIndex:section] count];

2.

//设定每行的单元格,提供两个参数第一个参数表示tableView所属,第二个参数为结构体 包含两个值 section表示当前区 row表示当前行 调用区*行次
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    //重用方式创建单元格,因为单元格经常会出现很多个,为了避免资源浪费,OC使用了重用机制,显示多少个 就创建多少个
    //设定一个重用标识符
    static NSString * cellID = @"cellID";
    //寻找带有重用标识符的单元格
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    //如果没有找到 则进行创建
    if (cell == nil) {
        //创建单元格,系统自带的单元格有四种样式,分别显示不同效果 最多显示 两个文字框一个图片框 如果是手动管理内存 则此处调用autorelease
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellID];
    }
    //设置主文本
    cell.textLabel.text =@"text";
    //设置副文本
    cell.detailTextLabel.text =@"text";
    //设置图片
    cell.imageView.image = [UIImage imageNamed:"1.jpg"];
    //如果系统提供的控件无法满足 需要自定义创建显示控件时 官方推荐增加到cell.contenView上面
    [cell.contentView addSubview:view];

非必选方法:

设定区头

//设定区头,需要重用机制 和cell差不多 区别是只调用区的数量的次数
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
    //cell换成UITableViewHeaderFooterView 设定frame无效 可以通过设定区头高度来改变大小 释放内存相同
    UITableViewHeaderFooterView * headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:viewID];
    //设定区头的颜色
    headerView.contentView.backgroundColor = [UIColor yellowColor];
    //添加view
    [headerView.contentView addSubview:but];

设定区数:

//设定区的数量 直接返回
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
    return zuArray.count;

至于区脚的设置 和区头区脚的高度设置方法可以看文档 用起来都差不多.

关于编辑状态editing:

关于这个编辑状态,通过不停测试,虽然没有搞清楚它的调用原理,但是规则已经了解.

//返回每个cell的可编辑状态,有多少个cell调用多少次,默认为YES,第一优先级 创建时优先调用,每次编辑状态改变优先调用 触发编辑后关闭,可以向左滑动cell主动调用,主动调用时如果tableView没有在编辑中,并且没写editingStyle方法或editingStyle方法返回值为UITableViewCellEditingStyleDelete 则在右侧显示删除按钮 如果返回NO 则返回NO的cell不能触发editing的所有事件
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}
#pragma mark --设置tabView编辑样式,移动 删除 和 添加
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    //这是第四种样式 前面一个可选的对勾
    return UITableViewCellEditingStyleDelete;
}
//设置移动 进入编辑状态后且canEditRowAtIndexPath canMoveRowAtIndexPath 返回YES 则可以拖动cell
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
}
//设置是否可以被拖拽
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}
//点击删除按钮后调用的方法
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
}
//设置移动后所在的位置 //第一参数是移动源坐标 第二坐标是移动目标坐标
-(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    //手动设置目标
    NSIndexPath * index = [NSIndexPath indexPathForRow:2 inSection:0];
    return sourceIndexPath;
}
//返回每一个取 区头的标题 返回什么就是设置什么
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return @"asddd";
}
//更改删除字样的名称
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
    return @"删除";
}
//进入编辑状态后是否缩进
-(BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    return YES;
}

关于背景设置:一定要注意 这两个是不同的

    //设置tableView的背景色
    tab.backgroundColor = [UIColor clearColor];
    //设置cell的背景色
    cell.contentView.backgroundColor = [UIColor blueColor];

动态注册单元格

1.非XIB

// 在创建tableView后注册单元格 第一个参数填写 单元格类名 第二个参数重用标示符
    [table registerClass:[UITableViewCell class] forCellReuseIdentifier:cellID];

// 第一个参数是重用标示符 
// 第二个参数indexPath 添的是哪个区哪个行
// 这个方法是ios6.0后出现的新方法 他把之前我们讲的重用原理封装了 如果没有cell 它就自动从注册的单元格类中自动创建一个
// 注意;我们使用注册系统的单元格的方法 没有办法重用自定义的控件 结论:注册系统的单元格一般不再cell添加控件 需要时请自定义cell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
    return cell;
}
// 注册区头区尾的
    [table registerClass:(Class) forHeaderFooterViewReuseIdentifier:(NSString *)];

2.XIB下注册自定义的cel

    // 注册xib的形式 我要创建一个继承与UITableViewCell的类并且带有一个xib
    UINib *nib = [UINib nibWithNibName:@"ZYTableViewCell" bundle:nil];
    [table registerNib:nib forCellReuseIdentifier:@"cellID"];
//使用方法和非XIB相同
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ZYTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
    cell.label.text = @"这是一行文字";
    return cell;
}
// 注册xib 区头区尾
[table registerNib:[UINib nibWithNibName:@"aa" bundle:nil] forHeaderFooterViewReuseIdentifier:@"headerID"];

你可能感兴趣的:(背景,删除,移动,重用)