如何解决在Swift 5中如何遍历作为结构项的标签
我有一个带有标签的结构;
struct InfoLabels {
var info0 = UILabel()
var info1 = UILabel()
var info2 = UILabel()
}
var infoLabels: [InfoLabels] = []
需要时,我们会添加新标签以显示在屏幕上。
像这样增加标签编号并在处添加它们以进行查看。 为了简单起见,这里没有显示标签的设置位置等。
infoLabels.append(InfoLabels())
当我不需要它们时,就是这样将它们从视图中删除的方式;
for k in 0..< infoLabels.count {
infoLabels[k].info0.removeFromSuperview()
infoLabels[k].info1.removeFromSuperview()
infoLabels[k].info2.removeFromSuperview()
}
但是当我更深入地研究原型应用程序时,信息标签的数量会增加并被删除 从这样的角度来看是不可行的。
我需要找到一种方法来遍历诸如info0,info1,...,infon之类的信息标签。 我看到使用镜像用法遍历结构项,但不适用于UILabel;
这不起作用;
let mirroredLabel = Mirror(reflecting: infoLabels)
for item in mirroredLabel.children
item.label.removeFromSuperview()
}
解决方法
为什么不
struct InfoLabels {
var count: Int
var labels: [UILabel] = []
init(_ count: Int) {
self.count = count
labels = Array(repeating: UILabel,count: count)
}
}
然后
infoLabels.append(InfoLabels(3))
用于删除
infoLabels.labels.forEach { $0.removeFromSuperview() }
,
我没有找到答案,但是我发现我使它如此工作的错误;
for k in 0..< infoLabels.count {
let mirroredLabel = Mirror(reflecting: infoLabels[k])
for label in mirroredLabel.children {
(label.value as! UILabel).removeFromSuperview()
}
}
,
您需要对InfoLabels
结构使用反射。因此您的代码可能看起来像这样:
infoLabels.forEach {
let mirroredLabel = Mirror(reflecting: $0)
mirroredLabel.children.forEach { child in
(child.value as? UILabel)?.removeFromSuperview()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。