Swift for循环赋值UILabel仅显示最后项 勾选不显示问题
问题现象
Swift开发过程中编写for-in循环遍历字符串数组,给通过IBOutlet关联的UILabel控件subTitle逐一赋值,运行后仅显示数组最后一个元素"checked","test"、"check"等其余元素均未正常展示,预期的勾选标记也未出现。
相关实现代码
override func viewDidLoad() { super.viewDidLoad() doSomething() label() } @IBOutlet weak var subTitle: UILabel! let text = ["test", "check", "checked"] func label(){ for name in text { print(subTitle.text = (name)) } }
运行效果截图

问题根因
你当前只关联了一个UILabel实例,for-in循环是同步串行执行的,执行速度极快:
- 第一次循环给label赋值
"test",还没等界面渲染完成 - 第二次循环立刻覆盖赋值为
"check" - 第三次循环最终覆盖赋值为
"checked"
等循环执行完毕、界面开始渲染时,label的text属性已经是最后一次赋值的"checked",自然看不到前两个元素的展示效果。
另外代码中print(subTitle.text = (name))属于不规范写法:赋值表达式本身会返回赋值后的值,所以这行只会把赋值结果打印到控制台,对界面展示没有任何正向作用,还会造成代码可读性下降。
修复方案
根据你的实际需求二选一即可:
- 需求1:逐一切换展示数组中的每个文本
不要用同步循环直接覆盖赋值,给每次赋值加间隔延时,等上一个文本渲染展示完成后再更新下一个值,参考实现:func label(){ for (index, name) in text.enumerated() { // 每隔2秒切换一次文本 DispatchQueue.main.asyncAfter(deadline: .now() + Double(index) * 2) { self.subTitle.text = name } } } - 需求2:在界面上同时展示数组内所有文本
要么将数组合并为单个字符串后赋值给当前label:subTitle.text = text.joined(separator: "\n")(用换行拼接三个文本,在同一个label里分行展示);要么创建对应数量的独立UILabel控件,每个控件对应赋值一个数组元素,不要反复给同一个label覆盖赋值。
内容的提问来源于stack exchange,提问作者Adjie Nugroho
相关产品推荐
相关产品推荐

