【问题标题】:NSTimer not stopping when invalidated in this functionNSTimer 在此函数中无效时不会停止
【发布时间】:2016-02-27 22:44:33
【问题描述】:

我正在尝试使用 NTTimer,但它不起作用。

从这里开始:

timer = NSTimer.scheduledTimerWithTimeInterval(0.003, target: self, selector: "openFrameAnimation", userInfo: nil, repeats: true)

它触发这个函数:

func openFrameAnimation(){
    Swift.print("Animation Goes... ",NSDate().timeIntervalSince1970)
    self.frame = NSRect(x: self.frame.origin.x,
        y: self.frame.origin.y-12,
        width: self.frame.width,
        height: self.frame.height + 12)
    if(self.frame.height >= self.finalFrame.height){
        Swift.print("STOP")
        self.frame = self.finalFrame
        timer.invalidate()
        // timer = nil //ERROR: nil cannot be assigned to type "NSTimer"
    }
    self.needsDisplay = true
}

即使一遍又一遍地打印“STOP”,计时器继续调用openFrameAnimation,我无法停止它。验证条件后如何停止计时器?

日志:

[...]
*Animation Goes...  1456613095.27813
STOP
[...]
Animation Goes...  1456613095.51233
STOP
Animation Goes...  1456613095.54458
[...]
STOP
Animation Goes...  1456613095.5938
STOP*

【问题讨论】:

  • 您展示的内容应该有效。您需要提供更多背景信息。启动计时器的代码在哪里? (在什么方法中)显示包含方法,并告诉我们它是如何调用的。定时器在哪里定义?我的猜测是您创建了多个计时器,然后“计时器”变量中仅引用了最后一个创建的计时器。
  • 您应该重写您的计时器方法 openFrameAnimation 以将 NSTimer 作为参数(触发调用该方法的计时器。)这是计时器方法的正常方法签名。然后,您可以记录计时器以查看发生了什么。
  • 我建议对动画使用CADisplayLink 而不是NSTimer。它是动画的最佳时机(出于动画目的,在尽可能早的时间触发)。有关此主题的讨论,请参阅developer.apple.com/videos/wwdc/2014/?id=236(大约 14 分钟)。 FWIW,即使您一直使用NSTimer,也没有必要每 0.003 秒运行一次计时器,因为最大帧速率为 60 fps,即大约每 0.01667 秒。此外,关于将计时器变量设置为nil,您可以将其设为可选,您可以将其设置为nil 并释放旧计时器。

标签: swift nstimer


【解决方案1】:

斯威夫特 4

  1. 添加

    var timer = Timer()
    

全班第一

  1. 设置您的计时器(使用您的原始信息 - 您可能希望根据一些建议进行更改,尤其是来自 @Rob 关于帧速率的建议)

    timer = Timer.scheduledTimer(timeInterval: 0.003, target: self, selector: #selector("openFrameAnimation"), userInfo: nil, repeats: true)
    
  2. 停止计时器

        timer.invalidate()
        timer = Timer()
    

【讨论】:

  • @Moebius - 这个答案已经帮助了很多人,所以我建议您检查您的设置以确保您已更改为本地设置(即,您不太可能将“openFrameAnimiation”作为选择器。 ..) 您可能还想从您正在使用的更多细节开始您自己的问题,以便有人可以更具体地帮助您。
  • 为什么要在stop函数中调用set timer = Timer()? timer.invalidate() 不应该足以阻止它吗? invalidate() 究竟做了什么?
  • @JDune timer.invalidate() 从 'timer' 变量中删除 'Timer()',所以你必须重新初始化它。
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多