iOS表视图UITableView之基础篇(二)
如果对
UITableView
的相关属性和协议还存在疑问,请先阅读我上一篇文章 iOS表视图UITableView之基础篇(一)。
UITableViewController
- 特点:
UITableViewController
继承于UIViewController
,自带一个tableView
。
- 在
UITableViewController
中,self.view
和self.tableView
是同一个对象。 -
datasource
和delegate
默认都是self
(UITableViewController
) - 开发中只需要建立
UITableViewController
类
UITableView编辑
首先,在ViewController.m
写出它的Extension
(延展),方便下面代码的使用:
@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, retain) UITableView *tableView; /** 表视图 */
@property (nonatomic, retain) NSMutableArray *dataSource; /** 数据源数组 */
@property (nonatomic, retain) NSMutableArray *deleteIndexPathsArray; /** 将要删除的元素的indexPath */
@end
-
UITableView
编辑步骤如下:
一、让UITableView
处于编辑状态:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
//先执行父类的setEditing方法:
[super setEditing:editing animated:animated];
//(1)让tableView处于可编辑状态:
[self.tableView setEditing:editing animated:animated];
}
二、协议设定:
1.确定Cell
是否处于编辑状态:
- (BOOL)tableView:(UITableView )tableView canEditRowAtIndexPath:(NSIndexPath )indexPath
{
//根据数据源进行筛选:
NSString name = [[self.dataSource objectAtIndex:indexPath.row] valueForKey:@"name"];
if ([name isEqualToString:@"张伟"]) {
return NO; //如果有名字叫张伟的同学,那个cell就不可编辑
}
return YES; //(2)所有都可以编辑
}
2.设定Cell
的编辑样式(删除/添加):
- (UITableViewCellEditingStyle)tableView:(UITableView )tableView editingStyleForRowAtIndexPath:(NSIndexPath )indexPath
{
//(3)设置支持删除操作:
// return UITableViewCellEditingStyleDelete;
//设置插入操作:
return UITableViewCellEditingStyleInsert;
}
3.编辑状态进行提交*:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
//判断编辑的样式:
if (editingStyle == UITableViewCellEditingStyleDelete) {
//删除对应的元素:
[self.dataSource removeObjectAtIndex:indexPath.row];
//刷新tableView:
[tableView reloadData];
}
//判断是插入操作:
if (editingStyle == UITableViewCellEditingStyleInsert) {
//设置要插入的数据:
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"dog", @"name", nil];
//将字典插入到数组的指定位置:
[self.dataSource insertObject:dic atIndex:indexPath.row];
//更新视图:
[tableView reloadData];
}
}
*** 注意:***
编辑结束后,由于numberOfRowInSection
这个协议只在tableview
添加到父视图的时候走一次, 且table
上的数据都是由数组提供,因此,需要先将数组中的元素删除,然后让table
的协议重新走一遍进行重新赋值。 即:先修改数据源,再刷新table
(如上,使用reloadData
方法) 。
-
移动
cell
的位置:
1.实现delegate
协议,告诉tableView
是否能移动:
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
2.移动:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
//记录原来的下标和新的下标:
NSInteger fromIndex = sourceIndexPath.row;
NSInteger toIndex = destinationIndexPath.row;
//记录数组元素:
NSDictionary *dic = [[self.dataSource objectAtIndex:fromIndex] retain];
//从数组中删除该元素:
[self.dataSource removeObject:dic];
//插入到新的位置:
[self.dataSource insertObject:dic atIndex:toIndex];
//更新视图:
[tableView reloadData];
} -
实现
dataSource
协议方法:#pragma mark --cell行数: - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } #pragma mark --cell的内容: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"]; cell.textLabel.text = [[self.dataSource objectAtIndex:indexPath.row] valueForKey:@"name"]; //判断是否正在被选中:(防止重用) if (![self.deleteIndexPathsArray containsObject:indexPath]) { cell.accessoryType = UITableViewCellAccessoryNone; } else { cell.accessoryType = UITableViewCellAccessoryCheckmark; } return cell; } #pragma mark --cell的高度: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 80; } #pragma mark --cell的点击方法: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //根据indexPath找到对应的cell: UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //判断数组里是否包含该indexPath: if ([self.deleteIndexPathsArray containsObject:indexPath]) { [self.deleteIndexPathsArray removeObject:indexPath]; //取消点击状态: cell.accessoryType = UITableViewCellAccessoryNone; } else { [self.deleteIndexPathsArray addObject:indexPath]; cell.accessoryType = UITableViewCellAccessoryCheckmark; } }
以上内容是笔者对
UITableView
基础的总结。由于笔者也是iOS
初学者,总结过程中难免出现纰漏。如发现不足或错误,欢迎批评指正。大家共同学习!共同进步!
有关UITableView
和iOS
的更多知识,请关注小编,期待后续文章!