UILabel意外地返回零

时间:2017-10-14 00:39:43

标签: ios swift uilabel

制作一个基本的秒表。我的模型正在更新控制器,但当我尝试更新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)
    }
}

2 个答案:

答案 0 :(得分:1)

问题在于这一行:

ViewController().setTitle(stopwatchValue)

你知道它的作用吗?它创建了一个全新的独立ViewController对象(不是接口中的对象),调用它的setTitle方法,然后抛弃它。

答案 1 :(得分:1)

Matt为您提供了代码的主要缺陷,尽管还有一些其他混乱可以清理。

至于你的StopWatchBrain如何调用你的视图控制器,这对于委托设计模式来说是一个很好的用例。阅读它。您将为StopWatchBrain类提供一个代理,它将在值更改时调用。

你将视图控制器作为StopWatchBrain的委托,当它的委托方法被一个新的计时器值调用时,它会更新它的标签。