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秒的。。。太快了。