多选删除和tableView的折叠是昨天没事的时候练习了一下,然后里面有些地方是需要注意的,来记录下,防止自己以后忘了 - -
多选删除
先说下多选删除,在这里的思路就是让tableView进入到编辑状态,同时注意返回编辑类型时,返回删除和插入。然后用一个可变数组记录所选择的cell的indexPath,之后删除即可。下面贴一下代码说明下,主讲思路和注意的点。
- 在这里返回tableView的编辑类型,这样才可以进行删除操作。
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
}
- 第一个方法是对选中cell的添加,第二个方法是对未选中cell的移除。在这里第二个方法是为了对应cell选中后再次选择取消选中后数组移除该cell的indexPath。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.selectedArray addObject:indexPath];
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.selectedArray removeObject:indexPath];
}
- 这里是删除操作,这里有个点说一下,在数组进行删除时,请注意不要挨个删除,这样做的后果就是超出下标!因为在你删除一个元素的时候,那时候后面的元素下边便会减少,这是你再进行删除,而原来数组记录的indexPath是不会变的,所以会超出下标。在这里我们要一次性全部删除,即可。
if (self.selectedArray.count >0) {
NSMutableIndexSet *indexSet = [[NSMutableIndexSet alloc]init];
for (NSIndexPath *indexPath in self.selectedArray) {
[indexSet addIndex:indexPath.row];
}
/** 这里注意 songs不能挨个删除 因为在删除一个的时候count已经发生变化 所以再删除时会超出下标 所以必须一次性全部删除**/
[self.songs removeObjectsAtIndexes:indexSet];
[self.tableView deleteRowsAtIndexPaths:self.selectedArray withRowAnimation:UITableViewRowAnimationAutomatic];
[self.selectedArray removeAllObjects];
}
[self.tableView reloadData];
tableView的折叠
这里简单说明下,我实现tableView折叠的思路:即点击headerView的时候,对是否展开进行判断,然后reload一下即可。是不是贼简单~下面来贴下代码细说下。
- 首先我这是创建了一个实体类,里面有两个属性,一个是是否展开,另一个是展开的数据。(我这投机取巧了,就是为了简单的实现功能,没有封装啥的 - -,所以讲下思路就行 - -)
/**
* 是否展开
*/
@property (nonatomic, assign) BOOL isFolding;
/**
* 数据
*/
@property (nonatomic, strong) NSArray *songs;
- 这是数据,一个字典。
TSFoldingExpansion *t1 = [[TSFoldingExpansion alloc]init];
TSFoldingExpansion *t2 = [[TSFoldingExpansion alloc]init];
TSFoldingExpansion *t3 = [[TSFoldingExpansion alloc]init];
t1.isFolding = YES;
t2.isFolding = YES;
t3.isFolding = YES;
t1.songs = [NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];
t2.songs = [NSArray arrayWithObjects:@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",@"18",@"19", nil];
t3.songs = [NSArray arrayWithObjects:@"20",@"21",@"22",@"23",@"24",@"25", nil];
_singerDic = [NSDictionary dictionaryWithObjectsAndKeys:t1,@"first",t2,@"second",t3,@"third", nil];
- 我们这里是自定义的headerView,在里面添加了一个button,同时将index.section赋给button的tag,记录下来方面在点击button的事件中进行reload。
id key = self.singerDic.allKeys[button.tag];
TSFoldingExpansion *foldingExpansion = self.singerDic[key];
if (foldingExpansion.isFolding) {
foldingExpansion.isFolding = NO;
} else {
foldingExpansion.isFolding = YES;
}
NSIndexSet *set = [NSIndexSet indexSetWithIndex:button.tag];
[self.tableview reloadSections:set withRowAnimation:UITableViewRowAnimationFade];
- 在这里我们需要获取到字典里的元素,然后判断其是否展开,返回对应的count。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger count;
id key = self.singerDic.allKeys[section];
TSFoldingExpansion *foldingExpansion = self.singerDic[key];
if (foldingExpansion.isFolding) {
count = foldingExpansion.songs.count;
} else{
count = 0;
}
return count;
}