我正在开发游戏,我想创建一个暂停菜单。这是我的代码:
self.view?.paused = true
但NSTimer.scheduledTimerWithTimeInterval
仍在运行......
for var i=0; i < rocketCount; i++ {
var a: NSTimeInterval = 1
ii += a
delaysShow = 2.0 + ((stimulus + interStimulus) * ii)
var time3 = NSTimer.scheduledTimerWithTimeInterval(delaysShow!, target: self, selector: Selector("showRocket:"), userInfo: rocketid[i], repeats: false)
}
我希望time3
在玩家点击暂停菜单时暂停计时器,并在玩家回到游戏时继续运行计时器,但我如何暂停NSTimer.scheduledTimerWithTimeInterval
?请帮帮我。
答案 0 :(得分:34)
您需要使其无效并重新创建它。然后,如果您有相同的按钮可以暂停和恢复计时器,则可以使用isPaused
bool来跟踪状态:
var isPaused = true
var timer = NSTimer()
@IBAction func pauseResume(sender: AnyObject) {
if isPaused{
timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("somAction"), userInfo: nil, repeats: true)
isPaused = false
} else {
timer.invalidate()
isPaused = true
}
}
答案 1 :(得分:5)
要阻止它
time3.invalidate()
重新开始
time3.fire()
答案 2 :(得分:5)
开始:
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateView"), userInfo: nil, repeats: true)
恢复:
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateView"), userInfo: nil, repeats: true)
暂停:
timer.invalidate
这对我有用。诀窍是不要寻找"timer.resume"
或"timer.validate"
之类的东西。只需使用“启动计时器的相同代码”即可在暂停后恢复它。
答案 3 :(得分:5)
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
timer.invalidate()
time += 1
label.text = String(time)
'label'是输出时的计时器。
答案 4 :(得分:4)
您无法恢复计时器。 而不是恢复 - 只需创建一个新的计时器。
class SomeClass : NSObject { // class must be NSObject, if there is no "NSObject" you'll get the error at runtime
var timer = NSTimer()
init() {
super.init()
startOrResumeTimer()
}
func timerAction() {
NSLog("timer action")
}
func pauseTimer() {
timer.invalidate
}
func startOrResumeTimer() {
timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("timerAction"), userInfo: nil, repeats: true)
}
}
答案 5 :(得分:2)
SWIFT3
全球宣言:
var swiftTimer = Timer()
var count = 30
var timer = Timer()
@IBOutlet weak var CountDownTimer: UILabel!
viewDidLoad中
override func viewDidLoad() {
super.viewDidLoad()
BtnStart.tag = 0
}
触发IBACTION:
@IBAction func BtnStartTapped(_ sender: Any) {
if BtnStart.tag == 0 {
BtnStart.setTitle("STOP", for: .normal)
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ScoreBoardVC.update), userInfo: nil, repeats: true)
BtnStart.tag = 1
} else {
BtnStart.setTitle("START", for: .normal)
timer.invalidate()
BtnStart.tag = 0
}
}
处理事物的功能:
func update(){
if(count > 0){
let minutes = String(count / 60)
let ConvMin = Float(minutes)
let minuttes1 = String(format: "%.0f", ConvMin!)
print(minutes)
let seconds = String(count % 60)
let ConvSec = Float(seconds)
let seconds1 = String(format: "%.0f", ConvSec!)
CountDownTimer.text = (minuttes1 + ":" + seconds1)
count += 1
}
}
答案 6 :(得分:0)
暂停计时器:timer.invalidate()
和
恢复计时器:重新创建计时器。它的工作正常。
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(mainController.updateTimer), userInfo: nil, repeats: true)
答案 7 :(得分:0)
即使这里暴露的解决方案很好,但我认为缺少一个重要的见解。像这里解释的很多人一样,timer invalidate()和recreate是最好的选择。但有人可能会说你可以这样做:
var paused:Bool
func timerAction() {
if !paused {
// Do stuff here
}
}
更容易实现,但效率会降低。
出于能源影响的原因,Apple会尽可能地避免使用计时器,并且更喜欢事件通知。如果您确实需要使用计时器,则应通过使当前计时器无效来有效实施暂停。在Apple Energy Efficiency Guide中阅读有关计时器的建议: https://developer.apple.com/library/content/documentation/Performance/Conceptual/EnergyGuide-iOS/MinimizeTimerUse.html
答案 8 :(得分:0)
我刚刚在游戏中遇到类似的问题,并且找到了一个简单的解决方案。
首先,我应该像其他人指出的那样,Timer和NSTimer没有暂停功能。您必须使用Timer.invalidate()停止Timer。使计时器无效后,必须再次对其进行初始化以启动计时器。要引用https://developer.apple.com/documentation/foundation/timer,函数.invalidate()-
阻止计时器再次触发并请求将其从中移除 它的运行循环。
要暂停计时器,我们可以使用Timer.fireDate,这是计时器(和NSTimer)保存计时器将来触发时间的地方。
在这里,我们可以通过保存计时器剩余的秒数来暂停计时器,直到计时器再次触发。
//The variable we will store the remaining timers time in
var timeUntilFire = TimeInterval()
//The timer to pause
var gameTimer = Timer.scheduledTimer(timeInterval: delaysShow!, target: self, selector: #selector(GameClass.showRocket), userInfo: rocketid[i], repeats: false)
func pauseTimer()
{
//Get the difference in seconds between now and the future fire date
timeUntilFire = gameTimer.fireDate.timeIntervalSinceNow
//Stop the timer
gameTimer.invalidate()
}
func resumeTimer()
{
//Start the timer again with the previously invalidated timers time left with timeUntilFire
gameTimer = Timer.scheduledTimer(timeInterval: timeUntilFire, target: self, selector: #selector(GameClass.showRocket), userInfo: rocketid[i], repeats: false)
}
注意:在获取fireDate之前,请勿使Timer无效()。在调用invalidate()之后,计时器似乎将fireDate重置为2001-01-01 00:00:00 +0000。
第二注:计时器在设置了fireDate之后可能会触发。这将导致一个负数,它将使Timer默认在0.1毫秒后运行。 https://developer.apple.com/documentation/foundation/timer/1412416-scheduledtimer