从此无心爱良夜
任他明月下西楼
前言
统计一个视图上所有子视图的个数包含子视图的子视图
实现方式
递归
DFS深度优先遍历
队列
BFS广度优先遍历
代码实现
递归
思想:
视图为空的时候返回0
视图没有子视图的时候返回1
视图有子视图的时候:
当前个数为count=1
遍历当前视图的所有子视图,再对子视图分别进行递归操作
NSInteger calculateAllSubviewsWithDFS(UIView *view) {
if (view == nil) { // 视图为空的时候返回0
return 0;
} else if (view.subviews.count == 0) { // 视图没有子视图的时候返回1
return 1;
} else {
NSInteger count = 1;
for (NSInteger i = 0; i < view.subviews.count; i++) {
count += calculateAllSubviewsWithDFS(view.subviews[i]);
}
return count;
}
}
队列
思想:
视图为空的时候返回0
视图没有子视图的时候返回1
视图有子视图的时候:
当前个数为count=1
创建队列
入队列
当队列不为空的时候
取出队列中第一个视图,并保存
计算第一个视图的的子视图个数
计算后第一个视图在队列中移除
遍历第一个视图的所有子视图,并且入队列
NSInteger calculateAllSubviewsWithBFS(UIView *view) {
if (view == nil) { // 视图为空的时候返回0
return 0;
} else if (view.subviews.count == 0) { // 视图没有子视图的时候返回1
return 1;
} else { // 视图有子视图的时候
NSInteger count = 1;
//创建队列
NSMutableArray *arrayM = [NSMutableArray array];
//入队列
[arrayM addObject:view];
// 当队列不为空的时候
while (arrayM.count) {
// 取出队列第一个视图
UIView *subview = arrayM[0];
//删除队列第一个视图
[arrayM removeObject:subview];
//计算第一个视图的的子视图个数
count += subview.subviews.count;
// 遍历第一个视图的所有子视图,并且入队列
for (NSInteger i = 0; i < subview.subviews.count; i++) {
// 入队列
[arrayM addObject:subview.subviews[i]];
}
}
return count;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。