【问题标题】:How to change the NSTimeInterval of an NSTimer after X seconds?如何在 X 秒后更改 NSTimer 的 NSTimeInterval?
【发布时间】:2016-01-03 04:37:26
【问题描述】:

我正在 swift 2 中制作一个应用程序,其中有两个计时器。 10 秒后,我希望另一个计时器运行得更快。我试过这样做,但没有成功(我正在尝试将 var time 更改为 1):

@IBOutlet var displayTimeLabel: UILabel!
var startTimer = NSTimeInterval()
var timer = NSTimer()
var timer2:NSTimer = NSTimer()    
var time = 2.0
@IBAction func Start(sender: UIButton) {
    if !timer2.valid {
        timer2 = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "updateTime", userInfo: nil, repeats: true)
        startTimer = NSDate.timeIntervalSinceReferenceDate()
    }
    timer = NSTimer.scheduledTimerWithTimeInterval(time, target: self, selector: "timer:", userInfo: nil, repeats: true)
}
func timer(timer: NSTimer){
//code
}
func updateTime() {        
    if displayTimeLabel.text >= "00:10.00"{
     print("00:10.00") //works
     time = 1 // trying to execute code after 10 seconds(doesn't work)
    }
    let currentTime = NSDate.timeIntervalSinceReferenceDate()
    var elapsedTime: NSTimeInterval = currentTime - startTimer
    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)
    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)
    let fraction = UInt8(elapsedTime * 100)
    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)
    displayTimeLabel.text = "\(strMinutes):\(strSeconds).\(strFraction)"
}

如果我在func timer 中写入 print(time),十秒后它将打印 1 而不是 2,但仍将每两秒重复一次。请帮忙。需要明确的是,我希望能够在十秒后将 time 更改为 1 而不是 2。我也不想使计时器无效。计时器也在repeat = true。在此先感谢...安东

【问题讨论】:

  • 你怎么知道time = 1 不起作用?不应该发生的应该是什么?
  • @聪明的错误func计时器中的代码不是每1秒重复一次,而是每两秒重复一次。
  • @ 聪明的错误如果我在 func 计时器中写入 print(time),十秒后它将打印 1 而不是 2,但它仍会每两秒重复一次。

标签: ios swift swift2 nstimer nstimeinterval


【解决方案1】:

一些事情。

首先,您无法更改重复 NSTimer 的时间间隔 - 您需要使第一个计时器无效并为新间隔安排一个新计时器。

对字符串进行第二次 >= 比较对您想要实现的目标不起作用。

最后,你已经陷入了和许多 Swift 程序员一样的坏习惯,不必要地初始化了你的定时器变量,结果却把这些定时器扔掉了。您应该使用可选的或隐式展开的可选

@IBOutlet var displayTimeLabel: UILabel!
var startTime:NSDate?
var timer : NSTimer?
var timer2: NSTimer?  
var time = 2.0

@IBAction func Start(sender: UIButton) {
    if (self.timer2 == nil) {
        self.time=2.0 
        self.timer2 = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "updateTime", userInfo: nil, repeats: true)
        self.startTime = NSDate()
        self.timer = NSTimer.scheduledTimerWithTimeInterval(time, target: self, selector: "timer:", userInfo: nil, repeats: true)
    }
}

func timer(timer: NSTimer){
//code
}
func updateTime() {        
    let currentTime = NSDate.timeIntervalSinceNow()
    var elapsedTime = -self.startTime!.timeIntervalSinceNow()
    if (elapsedTime >10.0 && self.time==2.0) {
       timer.invalidate()
       self.time=1.0
       self.timer = NSTimer.scheduledTimerWithTimeInterval(time, target: self, selector: "timer:", userInfo: nil, repeats: true)
    }

    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)
    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)
    let fraction = UInt8(elapsedTime * 100)
    displayTimeLabel.text = String(format: "%02d:%02d.%02d", minutes,seconds,fraction)
}

【讨论】:

  • 我现在关于变量的内容与您的代码(使变量可选)有什么区别?它会改变应用的性能吗?
  • 可能会有性能提升,但更多的是风格问题 - 您正在创建一个 NSTimer(未安排或设置)只是为了满足 Swift 对初始化非可选变量的要求但你稍后会扔掉这个计时器。如果一个变量直到稍后才真正被初始化,那么最好使用一个可选项来确保您的代码正确处理它。 Swift 中的选项允许你避免与使用初始化变量有关的一整类错误;以您的方式初始化它们会破坏整个好处
【解决方案2】:

只设置time = 1不会修改timer

定时器的timeInterval 不能更改。您唯一的选择是创建一个新计时器或以 timeInterval 为 1 启动它,并且每隔一次调用 timer() 就什么也不做,直到 10 秒过去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多