gpt4 book ai didi

swift - 在 Swift 中按下按钮时多次更新标签文本

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

在我的 swift 项目中,我有一个按钮,当我按下按钮时,我需要完成许多工作(假设这些工作从我按下按钮的那一刻起大约需要 40 秒)。因此,在这段时间内我的按钮处于“选中”状态。我想要的是在按下此按钮时多次更改标签的文本(每次都在完成特定功能后)。所以我有这样的东西:

@IBOutlet weak var myLabel: UILabel!
@IBAction func myButton(_ sender: UIButton) {
//Some huge functions which take 10 seconds to run
self.myLabel.text = "Some text1"

//Some other huge functions which take 10 seconds to run
self.myLabel.text = "Some text2"

//Some other other huge functions which take 10 seconds to run
self.myLabel.text = "Some text3"

//Some other other other huge functions which take 10 seconds to run
self.myLabel.text = "Some text4"
}

但是当我单击按钮时,所有这些功能开始运行并完成,但我只看到 myLabel 的文本正在更改为“Some text4”,它永远不会更改为“Some text1”或“Some text2”或“Some text3”,然后变成“Some text4”。我想也许放置 DispatchQueue.main.async{} 会有所帮助,但仍然不起作用。任何想法?谢谢。

最佳答案

由于您的代码是同步的,所以该行的代码会在上一行的代码之后立即执行。所以你总是会看到最后设置的文本 "Some text4"

为了在某事完成后调用一些代码,我们在 Swift 中使用完成处理程序

func call(_ completion: @escaping (String)->Void) {
completion("SomeText")
}

在需要时从方法内部调用完成,比方说,任务已完成。然后执行完成参数中的代码

call { text in // calling method
self.myLabel.text = text // this is called after you call completion(:) from inside `call(:)`
}

那么让我们用这个演示来试试吧

@IBAction func myButton(_ sender: UIButton) {

callAfter(2, text: "Text1") { text in
print(text)
}

callAfter(4, text: "Text2") { text in
print(text)
}

callAfter(6, text: "Text3") { text in
print(text)
}

}

func callAfter(_ duration: Double, text: String, _ completion: @escaping (String)->Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
completion(text)
}
}

...您应该能够在从那一刻起的第 2、4、6 秒内看到打印的 Text1Text2Text3当按下按钮时

关于swift - 在 Swift 中按下按钮时多次更新标签文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54158132/

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