使用Array(repeating:, count:)创建UILabel数组,为何添加后视图仅1个子视图?
为什么添加数组中7个UILabel后,视图子视图数量只有1?
这问题我之前也踩过坑!核心原因是你用的Array(repeating: UILabel(), count: 7)并没有创建7个独立的UILabel实例——它只是把同一个UILabel对象重复放进数组里7次而已。
让我拆解下这个过程:
- 当你调用
Array(repeating: UILabel(), count: 7)时,首先会执行一次UILabel()创建一个标签实例,然后把这个实例的引用复制7遍填充到数组中。所以数组里的7个元素其实指向的是内存中同一个对象。 - 当你遍历数组把每个元素添加到view的子视图时,本质上是在重复添加同一个UILabel。而UIKit的视图层级规则是:一个视图同一时间只能属于一个父视图,重复添加同一个视图的话,UIKit不会创建多个副本,后续的添加操作实际上不会改变子视图的数量,因为这个标签已经是当前view的子视图了。所以最终view的subviews里只有这一个UILabel实例。
要解决这个问题,你需要创建7个独立的UILabel实例,正确的写法可以用数组的map初始化方式:
let labels = (0..<7).map { _ in UILabel() }
这个写法会循环7次,每次都调用UILabel()创建一个全新的实例,这样数组里的每个元素都是不同的对象,添加到view后,view.subviews.count就会变成7了。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

