簡體   English   中英

UILabel意外返回nil

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM