制作一个基本的秒表。我的模型正在更新控制器,但当我尝试更新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)
}
}
答案 0 :(得分:1)
问题在于这一行:
ViewController().setTitle(stopwatchValue)
你知道它的作用吗?它创建了一个全新的独立ViewController对象(不是接口中的对象),调用它的setTitle
方法,然后抛弃它。
答案 1 :(得分:1)
Matt为您提供了代码的主要缺陷,尽管还有一些其他混乱可以清理。
至于你的StopWatchBrain
如何调用你的视图控制器,这对于委托设计模式来说是一个很好的用例。阅读它。您将为StopWatchBrain
类提供一个代理,它将在值更改时调用。
你将视图控制器作为StopWatchBrain
的委托,当它的委托方法被一个新的计时器值调用时,它会更新它的标签。