眾所周知,UITableView
只有section
和row
,是沒(méi)有多層級(jí)概念的。所以儒洛,想要做到像OA系統(tǒng)中的多級(jí)部門(mén)管理列表蔚携,就需要自己手動(dòng)實(shí)現(xiàn)希太。
原理
tableView
作為一個(gè)容器,每一行一個(gè)cell
酝蜒,點(diǎn)擊一行cell
時(shí)誊辉,去查找當(dāng)前cell下的模型(model)的子模型數(shù)組,插入到當(dāng)前模型下面亡脑,展示在界面上堕澄。隱藏時(shí)邀跃,再查找子模型數(shù)組刪除。
數(shù)據(jù)模型
@property (nonatomic, copy ) NSString * title;
@property (nonatomic, assign) NSInteger level;
@property (nonatomic, strong) NSMutableArray * subItems;
@property (nonatomic, assign) BOOL isSubItemOpen;
@property (nonatomic, assign) BOOL isSubCascadeOpen;
isSubItemOpen
標(biāo)記當(dāng)前cell展開(kāi)或隱藏蛙紫;isSubCascadeOpen
標(biāo)記該子菜單是否要在其父菜單展開(kāi)時(shí)自動(dòng)展開(kāi)拍屑;level
標(biāo)記當(dāng)前cell層級(jí)。
cell插入
#pragma mark - insert
- (NSArray *)insertMenuIndexPaths:(MyItem *)item {
NSArray *arr;
[treeItemsToInsert removeAllObjects];
[self insertMenuObject:item];
arr = [self insertIndexsOfMenuObject:treeItemsToInsert];
return arr;
}
//查找item下的所有需要插入的模型坑傅,臨時(shí)保存到treeItemsToInsert數(shù)組中
- (void)insertMenuObject:(MyItem *)item {
if (item == nil) {
return ;
}
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.tableViewData indexOfObject:item] inSection:0];
MyItem *childItem;
for (int i = 0; i < [item.subItems count]; i++) {
childItem = item.subItems[i];
[self.tableViewData insertObject:childItem atIndex:indexPath.row + i +1];
[treeItemsToInsert addObject:childItem];
item.isSubItemOpen = YES;
}
for (int i = 0; i < [item.subItems count]; i++) {
childItem = item.subItems[i];
if (childItem .isSubCascadeOpen) {
[self insertMenuObject:childItem];
}
}
}
//返回tableView需要插入的數(shù)組(indexPath路徑)
- (NSArray *)insertIndexsOfMenuObject:(NSMutableArray *)array {
NSMutableArray *arr = [NSMutableArray array];
for (MyItem *item in array) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.tableViewData indexOfObject:item] inSection:0];
[arr addObject:indexPath];
}
return arr;
}
cell刪除
#pragma mark - delete
- (NSArray *)deleteMenuIndexPaths:(MyItem *)item {
NSArray * arr;
[treeItemsToRemove removeAllObjects];
[self deleteMenuObject:item];
arr = [self deleteIndexsOfMenuObject:treeItemsToRemove];
return arr;
}
//查找需要?jiǎng)h除的模型數(shù)組
- (void) deleteMenuObject:(MyItem *)item {
if (item == nil)
{
return ;
}
MyItem *childItem;
for (int i = 0; i<[item.subItems count] && item.isSubItemOpen ; i++) {
childItem = [item.subItems objectAtIndex:i];
[self deleteMenuObject:childItem];
[treeItemsToRemove addObject:childItem];
// [tableViewData removeObject:childItem];
}
item.isSubItemOpen = NO;
return ;
}
//返回需要?jiǎng)h除的indexpatn數(shù)組
- (NSArray *) deleteIndexsOfMenuObject:(NSMutableArray *)arr {
NSMutableArray *mutableArr;
mutableArr = [NSMutableArray array];
NSMutableIndexSet * set;
set = [NSMutableIndexSet indexSet];
for (int i = 0; i < [treeItemsToRemove count]; i++)
{
MyItem * item;
item = [treeItemsToRemove objectAtIndex:i];
NSIndexPath *path = [NSIndexPath indexPathForRow:[self.tableViewData indexOfObject:item] inSection:0];
[mutableArr addObject:path];
[set addIndex:path.row];
}
[self.tableViewData removeObjectsAtIndexes:set];
return mutableArr;
}
cell點(diǎn)擊
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = (TableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
MyItem *item = cell.item;
if (item.isSubItemOpen) {
//刪除
NSArray *arr = [self.menuData deleteMenuIndexPaths:item];
[self.tableView deleteRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationBottom];
} else {
//插入
NSArray *arr = [self.menuData insertMenuIndexPaths:item];
[self.tableView insertRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationBottom];
}
}