Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 计时器工作时,如何设置NSTextField值?_Swift_Macos_Textfield_Nstextfield_Appkit - Fatal编程技术网

Swift 计时器工作时,如何设置NSTextField值?

Swift 计时器工作时,如何设置NSTextField值?,swift,macos,textfield,nstextfield,appkit,Swift,Macos,Textfield,Nstextfield,Appkit,我想制作一个计时器,有一个函数可以在计时器工作时设置计时器标签(确切地说是NSTextField)。但那不行 首先,我实现了一个显示时间的函数 func timeDisplay() { print("isTimerStart: \(TimerController.isTimerStart)") let timerSecond = TimerController.secondDuration self.minuteTextField.stringValue = Str

我想制作一个计时器,有一个函数可以在计时器工作时设置计时器标签(确切地说是
NSTextField
)。但那不行

首先,我实现了一个显示时间的函数

func timeDisplay() {

    print("isTimerStart: \(TimerController.isTimerStart)")

    let timerSecond = TimerController.secondDuration

    self.minuteTextField.stringValue = String(format: "%02d", (timerSecond / 60))
    print("minuteTextField: \(String(self.minuteTextField.integerValue))")

    self.secondTextFieled.stringValue = ": \(String(format: "%02d", TimerController.secondDuration % 60))"
    print("secondTextField: \(String(self.secondTextFieled.stringValue))")

}
我在
viewDidLoad()
中添加
timeDisplay()
来测试该函数

如果
timeDisplay()
是由
viewDidLoad()
触发的,或者只是点击按钮,那么它就可以正常工作

但是,如果我启动计时器并且
timeDisplay()
@objc
函数触发,则显示错误时不起作用,
minuteTextField
(或
secondTextField
)是可选值,因此当计时器打开时,我无法在
NSTextField
处设置值,而我只需按下按钮即可设置值:/

线程1:致命错误:隐式展开可选值时意外发现nil


哦,请帮帮我

要更新文本字段文本,您必须每隔一秒手动更改文本。您可以使用计时器来计划此触发。检查以下代码。我已经测试过了。您必须使用主线程来更新显示值

注意:-需要在textFeild初始化后设置计时器

    class TimerViewController: UIViewController {
    var timerTextField : UITextField? = nil
    override func viewDidLoad() {
        super.viewDidLoad()
        self.timerTextField = UITextField(frame: CGRect(x: 150, y: 400, width: 200, height: 50))

        self.view.addSubview(timerTextField!)

        //It should be started after textFeild init.
        self.startTimer()
    }
    func startTimer(){
        //MARK:- This Timer will refresh Text Feild for every 1 sec.
               Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timeDisplay), userInfo: nil, repeats: true)
    }
    @objc func timeDisplay(){
        //MARK:- This Example to display Device time. You can change this code as per your need.

       let date = Date()
       let calendar = Calendar.current
       let hour = calendar.component(.hour, from: date)
       let minutes = calendar.component(.minute, from: date)
       let sec = calendar.component(.second, from: date)

       let timeStr = "\(hour) : \(minutes) : \(sec)"
       DispatchQueue.main.async {
         self.timerTextField?.text = timeStr
       }
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.stopTimer()
    }

    func stopTimer(){ Timer.cancelPreviousPerformRequests(withTarget: timeDisplay())
    }
}
输出:-


首先,问题是针对MacOS,而不是针对iOS。第二,即使你的代码也不能正常工作,看看时间是如何从36秒变为37秒的。。。太快了。