[英]UILabel unexpectedly returns nil
制作基本的秒表。 我的模型很好地更新了控制器,但是當我嘗試更新UILabel
它返回nil
。
當我嘗試從計時器更新時,它僅返回nil
。 如果在不使用計時器的情況下更新控制器,它將更新標簽。
我想我一定很想念東西。
視圖控制器:
class ViewController: UIViewController {
var stopWatchBrainInstance = stopWatchBrain()
//Outlets
@IBOutlet weak var timerLabel: UILabel!
var displayValue:Int{
get{
print("getting Display Val")
return Int(timerLabel.text!)!
}
set{
timerLabel?.text! = String(val)
}
}
@IBAction func buttonPressed(_ sender: UIButton) {
if let buttonId = sender.currentTitle{
let testVAr = displayValue
stopWatchBrainInstance.setButton(pressed: buttonId, currentDisplayVal: testVAr)
displayValue = stopWatchBrainInstance.timerVal
}
}
}
模型:
class stopWatchBrain:NSObject {
//Public API
public func setButton(pressed identifier:String,currentDisplayVal:Int){
switch identifier{
case "Start":
startTimer(currentTime: currentDisplayVal)
break
case "Stop":
stopTimer()
default:
break
}
}
public var timerVal: Int {
get{
return stopwatchValue
}
}
//Vars
private var timer = Timer()
private var stopwatchValue:Int = 1
//Methods
private func startTimer (currentTime: Int){
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(self.runtheTimer)) , userInfo: nil, repeats: true)
}
private func stopTimer (){
print("stopping timer")
timer.invalidate()
}
@objc private func runtheTimer(){
stopwatchValue += 1
print(stopwatchValue)
ViewController().setTitle(stopwatchValue)
}
}
問題是這一行:
ViewController().setTitle(stopwatchValue)
你知道它做什么嗎? 它創建了一個全新的獨立的ViewController對象(而不是接口中的那個),調用其setTitle
方法並將其丟棄。
Matt還為您提供了代碼的主要缺陷,盡管還有一些其他問題需要解決。
至於StopWatchBrain
如何調用視圖控制器,這對於委托設計模式將是一個很好的用例。 繼續閱讀。 您將給StopWatchBrain
類一個委托,當值更改時將調用該委托。
您將使視圖控制器成為StopWatchBrain
的委托,當使用新的計時器值調用委托方法時,它將更新其標簽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.