Как сделать паузу / играть в NSTimer? - PullRequest
14 голосов
/ 02 апреля 2012

Мне нужно запустить NSTimer с 0: 0: 0, что я делаю, и у меня при нажатии на кнопку «Пауза» таймер должен остановиться через некоторое время, если пользователь нажимает кнопку воспроизведения, он должен запускаться с паузы времени , Как я могу сделать паузу и играть в NSTimer? Любая помощь? Заранее спасибо.

Ответы [ 6 ]

21 голосов
/ 02 апреля 2012

Попробуйте это 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.забудь метод дауна.секунды, минуты, часы - Ints

- (void)countUp
{
    seconds += 1;

    if (seconds == 60) 
    {
        seconds = 0;
        minutes++;

        if (minutes == 60) 
        {
            minutes = 0;
            hours++;
        }
    }

}
8 голосов
/ 02 апреля 2012

Вы не. Вместо того чтобы делать паузу, просто сделайте недействительным и отпустите старый таймер, а когда пользователи снова нажмут кнопку «Воспроизвести», создайте новый таймер.

4 голосов
/ 14 сентября 2013

refreshTimer должно быть на уровне класса. Используйте следующий код для остановки таймера:

refreshTimer = [NSTimer scheduledTimerWithTimeInterval: refreshInSeconds
                                                target: self
                                              selector: @selector(refreshPage)
                                              userInfo: nil
                                               repeats: YES];
[refreshTimer invalidate];
refreshTimer = nil;

Для запуска вы можете снова запланировать таймер как Строка 3

3 голосов
/ 02 апреля 2012

Используйте следующий код для запуска таймера также с аргументами:

timer = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(callMyMethod:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:web1, @"web", baseURL, @"baseURL", option1, @"option", nil] repeats:NO];

, а затем используйте

[timer invalidate];

для остановки таймера.

Я надеюсь, что этот код будетпомочь вам.

Спасибо.

1 голос
/ 05 августа 2015

Нет такой вещи, как пауза для NSTimer, вы должны остановиться и запустить ее снова.

[yourTimer invalidate];// остановит таймер, после чего вы можете запустить его снова

0 голосов
/ 14 марта 2016

Обновлен ответ на 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()
  }
}
...