【问题标题】:How to Pause/Play NSTimer?如何暂停/播放 NSTimer?
【发布时间】:2012-04-16 01:29:34
【问题描述】:

我需要在我正在做的 0:0:0 之前启动 NSTimer,并且我有一个暂停按钮点击该按钮,如果用户点击播放,计时器必须在一段时间后暂停,它必须从暂停的时间值运行.如何在 NSTimer 中暂停和播放? 有什么帮助吗?提前致谢。

【问题讨论】:

标签: iphone objective-c ios xcode4 nstimer


【解决方案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];
        

        停止计时器。

        希望这段代码对你有所帮助。

        谢谢。

        【讨论】:

          猜你喜欢
          • 2017-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-25
          • 2015-03-20
          • 1970-01-01
          • 2014-04-01
          • 2012-02-19
          相关资源
          最近更新 更多