如何暂停/播放 NSTimer?
Posted
技术标签:
【中文标题】如何暂停/播放 NSTimer?【英文标题】:How to Pause/Play NSTimer? 【发布时间】:2012-04-16 01:29:34 【问题描述】:我需要在我正在做的 0:0:0 之前启动 NSTimer,并且我有一个暂停按钮点击该按钮,如果用户点击播放,计时器必须在一段时间后暂停,它必须从暂停的时间值运行.如何在 NSTimer 中暂停和播放? 有什么帮助吗?提前致谢。
【问题讨论】:
你只是想记录一些经过的时间吗? NSTimer 并不是为了这个目的。它的目的或多或少是安排在运行循环中触发的事件。 Stopwatch using NSTimer incorrectly includes paused time in display 的可能重复项 【参考方案1】:Swift 2 的更新答案
import UIKit
class ViewController: UIViewController
var myTimer = NSTimer()
var time = 0 // global var
@IBOutlet weak var counterLabel: UILabel!
@IBAction func pauseTimer(sender: AnyObject)
myTimer.invalidate()
@IBAction func startTimer(sender: AnyObject)
myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("result"), userInfo: nil, repeats: true)
func result()
time++
counterLabel.text = String(time)
print(time)
override func viewDidLoad()
super.viewDidLoad()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
【讨论】:
【参考方案2】:NSTimer 没有暂停之类的东西,你必须停止并重新启动它。
[你的计时器无效]; //将停止计时器,之后您可以重新启动它
【讨论】:
【参考方案3】:refreshTimer
应该在班级级别。使用以下代码停止计时器:
refreshTimer = [NSTimer scheduledTimerWithTimeInterval: refreshInSeconds
target: self
selector: @selector(refreshPage)
userInfo: nil
repeats: YES];
[refreshTimer invalidate];
refreshTimer = nil;
要开始,您可以再次将计时器安排为第 3 行
【讨论】:
【参考方案4】:试试这个 shizzle... 对我很有用
编辑
说实话,我的实际代码是这样的:
-(IBAction)clicked:(id)sender
if ([startStop.titleLabel.text isEqualToString:@"Start"])
[startStop setTitle:@"Pause" forState:UIControlStateNormal];
[startStop setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countUp) userInfo:nil repeats:YES];
timerDown = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDown) userInfo:nil repeats:YES];
else if ([startStop.titleLabel.text isEqualToString:@"Pause"])
[startStop setTitle:@"Resume" forState:UIControlStateNormal];
[startStop setTitleColor:[UIColor colorWithRed:0/255 green:0/255 blue:255/255 alpha:1.0] forState:UIControlStateNormal];
pauseStart = [[NSDate dateWithTimeIntervalSinceNow:0] retain];
previousFireDate = [[timer fireDate] retain];
[timer setFireDate:[NSDate distantFuture]];
else if ([startStop.titleLabel.text isEqualToString:@"Resume"])
[startStop setTitle:@"Pause" forState:UIControlStateNormal];
[startStop setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
float pauseTime = -1*[pauseStart timeIntervalSinceNow];
[timer setFireDate:[NSDate dateWithTimeInterval:pauseTime sinceDate:previousFireDate]];
[pauseStart release];
[previousFireDate release];
我使用了 UIButton 并在单击时使用了此代码。
记得把这个:
NSDate *pauseStart, *previousFireDate;
在您的 .h 文件中
编辑!
这里是 countUp 方法。忘记down方法。秒、分、小时是整数
- (void)countUp
seconds += 1;
if (seconds == 60)
seconds = 0;
minutes++;
if (minutes == 60)
minutes = 0;
hours++;
【讨论】:
你是如何将 NSTimer 参数传递给这两种方法的? b'因为我在 NSString,,, 中暂停了几秒钟 感谢更新,我想你忘了包括 countUp 和 countDown 方法代码,你能告诉我这些方法里面有什么吗?【参考方案5】:你没有。与其暂停,不如简单地使旧计时器失效并释放,当用户再次按下“播放”时,创建一个新计时器。
【讨论】:
感谢您的回复,如何创建新计时器?我的意思是我需要将我的 PausedTime 传递给哪个 NSTimer 方法,以及我如何以 NSString 格式获得它。【参考方案6】:使用以下代码也可以使用参数启动计时器:
timer = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(callMyMethod:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:web1, @"web", baseURL, @"baseURL", option1, @"option", nil] repeats:NO];
然后使用
[timer invalidate];
停止计时器。
希望这段代码对你有所帮助。
谢谢。
【讨论】:
以上是关于如何暂停/播放 NSTimer?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何让 NSTimer 在 iOS 中为我的音频播放器在后台运行
UIScrollView 暂停 NSTimer 直到滚动完成