gpt4 book ai didi

ios - Swift didSet 已调用但未更新 UILabel - iOS 属性观察器

转载 作者:行者123 更新时间:2023-11-28 20:50:19 27 4
gpt4 key购买 nike

知道为什么我的 label.text 只在计数完成时才更新吗?

didSet 被调用。但是 label.text = String(counter) 似乎什么也没做。

swift 5

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var label: UILabel!

var counter:Int = 0 {
didSet {
print("old value \(oldValue) and new value: \(counter)")
label.text = String(counter)
sleep(1). // just added to show the label.text is not updating
}
}

@IBAction func start_btn(_ sender: Any) {
for _ in 1...3 {
counter += 1
}
}
}

didSet 代码从主线程调用。它与 Storyboard(不是 SwiftUI)都正确连接。

可以看到调用了didSet代码。

old value 0 and new value: 1. Main thread: true
old value 1 and new value: 2. Main thread: true
old value 2 and new value: 3. Main thread: true

最佳答案

看起来您正在尝试制作某种从 0 开始到 3 停止的计数器。如果是这种情况,您不应该调用 sleep(它会阻塞主线程)。

编辑:显然 sleep 调用是为了演示目的而添加的?在任何情况下,您的标签似乎只在计数完成时更新的原因是 for 循环运行得太快,UI 无法在每个 counter 增量上更新。

而是使用 Timer:

counter = 0
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
self.counter += 1

if self.counter >= 3 {
timer.invalidate()
}
}

这是基于我对您要实现的目标的粗略理解。

您还可以DispatchQueue.main.asyncAfter:

func countUp() {
guard counter < 3 else { return }

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.counter += 1
fire()
}
}

对于较短的时间间隔,两种方法之间的差异将非常微不足道。对于真正准确的时间计数,人们不应该依赖任何一个,而是将 DateTimer 一起使用,例如每十分之一秒触发一次,并通过四舍五入更新计数器精确到秒(例如)。

关于ios - Swift didSet 已调用但未更新 UILabel - iOS 属性观察器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58979382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com