Ios 如何在按下按钮时更改UILabel文本

Ios 如何在按下按钮时更改UILabel文本,ios,swift,Ios,Swift,我想更改标签的文本,以便在润色行动CAL时了解进度状态。以下是一个例子: @IBOutlet weak var stsLabel: UILabel! // label to show to user, the progress position @IBAction func updateDB(_ sender: Any) { stsLabel.text = "creating table" // do some stuf stsLabel.text = "i

我想更改标签的文本,以便在润色行动CAL时了解进度状态。以下是一个例子:

@IBOutlet weak var stsLabel: UILabel! // label to show to user, the progress position 

@IBAction func updateDB(_ sender: Any) {

     stsLabel.text = "creating table"
     // do some stuf

     stsLabel.text = "inserting table A"
     // some code
     // and i have some cases again

     stsLabel.text = "Complete"
 }

func setTitle(label:UILabel, title:String){
    DispatchQueue.main.async(execute: { () -> Void in
        label.text = title
    })      
}
该代码将仅在操作完成时更改标签文本。我试过用setTitlessLabel,任何文本,这也没有帮助。请帮我解决这个问题。
信息:我使用的是swift的3个版本。

由于您没有提供足够的信息来提供全面的答案,此答案基于最佳猜测,因此可能不准确

如果在主线程上执行do Anything代码,那么当所有操作都完成时,您将看到UI更新,因为您正在阻止主线程

如果您的代码如下所示:

@IBAction func updateDB(_ sender: Any) {

     stsLabel.text = "creating table"
     DispatchQueue.global().async {
         // do some stuf
     }

     stsLabel.text = "inserting table A"
     DispatchQueue.global().async {
         // some code
         // and i have some cases again
     }

     stsLabel.text = "Complete"
 }
然后问题是dosomestuff代码是异步执行的,因此所有的文本分配都在主线程上一个接一个地执行,因此您将只看到最后一个,因为其他两个太快,无法看到

如果您的代码如下所示:

@IBAction func updateDB(_ sender: Any) {

     stsLabel.text = "creating table"
     DispatchQueue.global().async {
         // do some stuf

         stsLabel.text = "inserting table A"
         // some code
         // and i have some cases again

         stsLabel.text = "Complete"
     }
 }
@IBAction func updateDB(_ sender: Any) {

     stsLabel.text = "creating table"
     DispatchQueue.global().async {
         // do some stuf

         DispatchQueue.main.async(execute: { () -> Void in
             stsLabel.text = "inserting table A"
         }) 
         // some code
         // and i have some cases again

         DispatchQueue.main.async(execute: { () -> Void in
             stsLabel.text = "Complete"
         }) 
     }
 }
然后问题是所有与UI相关的东西都必须放在主线程上。脱离主线程进行更新的结果将导致更新发生巨大延迟,在某些情况下可能导致崩溃

做这类事情的健康方法是在主线程上调度UI操作。代码应该如下所示:

@IBAction func updateDB(_ sender: Any) {

     stsLabel.text = "creating table"
     DispatchQueue.global().async {
         // do some stuf

         stsLabel.text = "inserting table A"
         // some code
         // and i have some cases again

         stsLabel.text = "Complete"
     }
 }
@IBAction func updateDB(_ sender: Any) {

     stsLabel.text = "creating table"
     DispatchQueue.global().async {
         // do some stuf

         DispatchQueue.main.async(execute: { () -> Void in
             stsLabel.text = "inserting table A"
         }) 
         // some code
         // and i have some cases again

         DispatchQueue.main.async(execute: { () -> Void in
             stsLabel.text = "Complete"
         }) 
     }
 }

使用UIButton控制状态的触地操作将完成哪些操作?因为如果有一个完成框,你可以在那里更新标签。操作是按钮润色。请看一下图片我们需要看看是什么做了些什么来告诉你发生了什么。我的最佳猜测是,该操作不是异步的,因此在完成所有操作后,您将获得UI更新,因为您正在阻止主线程。DispatchQueue.globalattributes:。qosUserInitiated获取错误参数标签的属性:'不匹配任何可用的重载我使用DispatchQueue.global.async,它可以工作,非常感谢