tableview的大部分操作都是在代理方法中进行的!!!
//UITableViewCell 视图,tableView中每一行都是一个UITableViewCell对象
//indexPath (section,row,用于描述此行数据位于第几分区,第几行)
//UITableViewCell 对象,被赋好值后,返回给tableView
/*UITableViewCell的重用机制
*1、不是有多少行数据,就创建多少个cell,每个UITableView都有一个可重用的队列,滑出屏幕的cell,会被先放到可重用队列中
*2、UITableView的重用机制,最大限度的节省了程序的内存开销,提高了程序的运行效率,重用机制对于程序的开发具有非凡的借鉴意义
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//cell的可重用标识符
static NSString *cellId = @"cell";
//根据cell的可重用标识符,到tableView的可重用队列中,获取cell对象
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (cell == nil) {
//拿不到,则alloc init
//初始化cell,并设置cell的样式,给cell赋值可重用标识符
//UITableViewCellStyleSubtitle 主标题,副标题样式
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId] autorelease];
//设置cell选中的风格样式
cell.selectionStyle = UITableViewCellSelectionStyleGray;
//设置cell右边的附属按钮样式
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;//blue
}
//给cell的赋值操作,写在cell == nil之外
//根据分区下标从_data中获取array
NSArray *array = [_data objectAtIndex:indexPath.section];
//根据行的下标,取到array中字符串
NSString *str = [array objectAtIndex:indexPath.row];
//设置cell的主标题
cell.textLabel.text = str;
//设置cell的副标题
cell.detailTextLabel.text = @"副标题";
return cell;
}
//每个分区里的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
上面的2个是必须实现的。下面的都是可选的,根据项目需求实现。
//分区数量,默认1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
//分区的头标题和脚标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
//行高(默认44),分区头标题高度,脚标题高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
//将一个view设成头标题
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
//选中表格视图某一行后,触发的方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//行被选中后,自动变回反选状态的方法
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
//必须有蓝色的按钮出现,才能点击执行这个方法,点出附属按钮
NSLog(@“点击了第%d分区%d行",indexPath.section,indexPath.row);
}
#pragma mark - editing 下面都是编辑相关
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{//编辑的方法,如果其它的编辑都不设,只设了这一个,那么就会有cell右滑出现删除的按钮,也是比较常用的
if (editingStyle == UITableViewCellEditingStyleDelete){
//删除
[[dataArr objectAtIndex:indexPath.section] removeObjectAtIndex:indexPath.row]; //删除数据源记录
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];//删除cell
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
//插入
[[dataArr objectAtIndex:indexPath.section] insertObject:@"a new cell" atIndex:indexPath.row];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{//删除按钮的字
return @"删";
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{//返回编辑模式,默认是删除
if (indexPath.section) {
return UITableViewCellEditingStyleInsert;
}
return UITableViewCellEditingStyleDelete;
}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{//移动事件
//用一个指针指向要移动的数据源
Person *xiao = [[_dataArr objectAtIndex:sourceIndexPath.section] objectAtIndex:sourceIndexPath.row];
//将数据源中需要移动的对象删除
[[_dataArr objectAtIndex:sourceIndexPath.section] removeObjectAtIndex:sourceIndexPath.row];
//在新位置插入
[[_dataArr objectAtIndex:destinationIndexPath.section] insertObject:xiao atIndex:destinationIndexPath.row];
}