我在我的项目中使用 NSTimer:
var clickTimer: Timer?
override func mouseDown(with event: NSEvent) {
clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)
}
后来我在
override func mouseUp(with event: NSEvent) {
if let timer = self.clickTimer {
timer.invalidate()
}
}
mouseUp
中的代码正在运行,但计时器的close
方法仍在 2 秒内运行。为什么无效不起作用?
我现在明白了,你不想重新声明你的clickTimer
所以你想做的是
if (self.clickTimer == nil) {
self.clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)
}
只是一个想法,您正在多次重新初始化点击计时器,以前的成功无效,但您不小心重新声明了一个新的计时器.. 嗯。
为了安全起见,我还建议您在timer.invalidate()
之后添加self.clickTimer = nil
尝试此代码,先使其无效,然后删除引用。
override func mouseUp(with event: NSEvent) {
self.clickTimer?.invalidate()
self.clickTimer = nil
}
您正在使self.clickTimer 的实例无效,则应使self.clickTimer 失效
override func mouseUp(with event: NSEvent) {
if let timer = self.clickTimer {
self.clickTimer.invalidate()
}
}
更新
我明白了,你没有触发clickTimer !如果你想这样做,你必须首先触发这个变量 ->clickTimer.fire((
那么当你想要的时候,你应该无效,
'Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)
当您想要声明 clickTimer 时自动运行,但这不是您想要使!!失效的内容
当多次调用mouseDown(with:)
时出现问题,您的原始计时器将被替换,因此这意味着您没有引用来使其无效。
var clickTimer: Timer?
override func mouseDown(with event: NSEvent) {
clickTimer?.invalidate()
clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)
}
override func mouseUp(with event: NSEvent) {
clickTimer?.invalidate()
}
试试这个
private var clickTimer: NSTimer?
func functionname() {
guard clickTimer == nil else { return }
clickTimer = NSTimer.scheduledTimerWithTimeInterval(15, target: self, selector: "fetchWallPosts", userInfo: nil, repeats: true)
}
或
self. clickTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(yourmethod)), userInfo: nil, repeats: true)
试试这个 -
if (self.clickTimer == nil) {
self.clickTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(close(timer:)), userInfo: nil, repeats: false)
}