2017-06-03 45 views
0

我是新来的swift。在我的UI上,我有标签显示一些类实例的值。而且,我有一个增加这些实例的值的类方法。在我调用这个方法之后,我的实例值会更新;但用户界面上的标签保持不变。我怎样才能让这个方法在这些标签中更新我的号码。在方法对变量进行更改后更新UI上的值(Swift 3)

这里是我的ViewController代码:

@IBOutlet weak var displayValue: UILabel! //this is the label that displays newNumber's value 

override func viewDidLoad() { 
    super.viewDidLoad() 
    dispValue.text = String("\(newNumber.value))") 
} 

这里是我的代码:

class MyNumbers { 
    var value = 50 

    func increaseValue(by: Int){ 
     value += by 
    } 
} 

var newNumber = myNumbers() 
newNumber.increaseValue(by: 5) //This does increase newNumber's value to 55 
//but my label on my UI remains as 50 

回答

0

您需要分配更新值到的UILabel。作为最佳实践,始终确保您正在调用主线程中的UI更改,并在进行UI更新时更新AutoLayouts。

替换:

newNumber.increaseValue(by: 5) 

有了:

DispatchQueue.main.async { 
    newNumber.increaseValue(by: 5) 
    self.displayValue.text = "\(newNumber.value)" 
    self.view.layoutIfNeeded() 
} 
+0

让我知道这不工作或满足您的需求。如果你清楚,请接受答案。谢谢:) – CoderFrom94

+0

谢谢你的答案。我也可以问使用“DispatchQueue.main.async”的目的是什么,而不仅仅是写“displayValue.text =”\(newNumber.value)“?@ CoderFrom94 –

+0

@HazarPanc,我们期待更新displayValue标签,这样做是一个UI更新,UI更新必须只在主线程中完成,你也可以使用'Thread.isMainThread'来检查你是否已经在主线程中,'DispatchQueue.main.async'将执行main即使当前线程不是主线程也是如此。 – CoderFrom94