2017-10-14 97 views
-1

製作一個基本的秒錶。我的模型正在更新我的控制器,但是當我嘗試更新我的UILabel時,它將返回nilUILabel意外返回無

當我試圖從計時器更新時,它只返回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

與您的問題無關,但您的'displayValue'屬性實施效果不佳。不要將標籤用作數據。只需使用標籤來顯示值。將您的屬性更改爲:var displayValue = 0 {didSet {timerLabel = String(displayValue)}}'。 – rmaddy

+0

注意到謝謝maddy –

+1

@rmaddy你的意思是'timerLabel.text = String(displayValue)' –

回答

1

的問題是這一行:

ViewController().setTitle(stopwatchValue) 

你知道它做什麼?它會創建一個全新的,獨立的ViewController對象(不是接口中的對象),調用它的方法並將其拋棄。

+0

ahhhhh這是有道理的。那麼,我如何調用我想要的視圖控制器? –

+0

@SusanHo當你創建視圖控制器時,你需要給視圖控制器一個(弱)引用,這樣它就可以找到視圖控制器。 – matt

1

馬特給你的代碼的主要缺陷,雖然也有一些其他的垃圾清理以及。

至於你的StopWatchBrain將如何調用你的視圖控制器,這將是一個很好的委託設計模式的用例。請閱讀。你會給你的StopWatchBrain類一個委託,它會在值改變時調用。

你可以讓視圖控制器成爲StopWatchBrain的代表,它會在委託方法被新的定時器值調用時更新它的標籤。