NSTimer 失效无法正常工作



我在我的项目中使用 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) 
}

最新更新