【问题标题】:iOS How to start and pause timeriOS 如何启动和暂停计时器
【发布时间】:2015-10-19 09:44:02
【问题描述】:

我开发了一个应用程序。在我的应用程序中,有两个 UIButtons ,StartBtnStopBtn,我也使用了 NSTimer

现在,我想在用户点击 StartBtn 时启动 NSTimer,并在您点击 StopBtn 时停止。

我想设置NSTimer 1 分钟,如果我在 30 秒内停止计时器。然后剩下 30 秒。当我再次单击StartBtn 时将再次启动,完成 1 分钟后它应该显示 alertMessage。

我知道 NSTimer 被 [MyTimerName invalidate] 停止;方法,但我不知道如何暂停它并再次从上次停止时间开始?

【问题讨论】:

  • 我相信你必须重新声明它。 MyTimerName = [NSTimer ...]我猜你在做一个计时器应用程序?
  • 我想在我的应用程序中录制一分钟的声音,效果很好。只剩下这个计时器问题了。
  • 如果您有代码 sn-p 则请张贴。真的很感激。
  • 与其将 NSTimer 设置为 1 分钟,不如将其设置为每秒触发一次并减少一个计数器
  • 确实;当它“暂停”时,您只需忽略它。

标签: ios objective-c


【解决方案1】:

NSTimer 中没有名为pause 的事件

下面的实现暂停和恢复功能是你可以做的。

  1. 点击开始时,注意当前时间。

  2. 点击暂停时,注意当前时间。

  3. 当您再次单击开始时,您将创建 NSTimer,其剩余时间为步骤 2 时间 - 步骤 1 时间。

希望您对需要做什么有所了解...

【讨论】:

    【解决方案2】:
    - (IBAction)btn_start:(id)sender
    {
        if ([startpause.titleLabel.text isEqualToString:@"Start"])
    {
        [startpause setTitle:@"Pause" forState:UIControlStateNormal];
        [startpause setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        if (!_myTimer)
        {
            _myTimer = [self createTimer];
        }
        [self.viewww setHidden:NO];
        [self.shuffle_out setUserInteractionEnabled:YES];
        [self.viewww setUserInteractionEnabled:YES];
    }
    else if ([startpause.titleLabel.text isEqualToString:@"Pause"])
    {
        [startpause setTitle:@"Start" forState:UIControlStateNormal];
        [startpause setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        if (!_currentTimeInSeconds)
        {
            _currentTimeInSeconds = 0 ;
        }
        [_myTimer invalidate];
        [self.shuffle_out setUserInteractionEnabled:NO];
        [self.viewww setHidden:YES];
        [self.viewww setUserInteractionEnabled:NO];
    }
    }
    
    - (NSTimer *)createTimer
    {
        return [NSTimer scheduledTimerWithTimeInterval:1.0
                                            target:self
                                          selector:@selector(timerTicked:)
                                          userInfo:nil
                                           repeats:YES];
    }
    - (NSString *)formattedTime:(int)totalSeconds
    {
        int seconds = totalSeconds % 60;
        int minutes = (totalSeconds / 60) % 60;
    
        return [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
    }
    - (void)timerTicked:(NSTimer *)timer
    {
        _currentTimeInSeconds++;
        self.lbl_timer.text = [self formattedTime:_currentTimeInSeconds];
        if ([lbl_timer.text isEqualToString:@"01:00"])
    {
        [_myTimer invalidate];
        //lbl_timer.text=@"00:00";
        [startpause setTitle:@"Start" forState:UIControlStateNormal];
        [startpause setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
        UIAlertView *alrt=[[UIAlertView alloc]initWithTitle:nil message:@"⏰...Game Over...⌛️" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
        [alrt show];
       }
    }
    

    这对我来说就像魅力一样......

    【讨论】:

      【解决方案3】:

      创建对象喜欢..

      NSTimer *timer;
      

      停止计时器

       if (timer)
          {
              [timer invalidate];
              timer = nil;
          }
      

      启动计时器

      timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(percentageUpdate) userInfo:nil repeats:YES];
      

      也可以在 viewDidDisappear 方法中取消

      - (void) viewDidDisappear:(BOOL)animated
      {
          [super viewDidDisappear:animated];
          if (timer)
          {
              [timer invalidate];
              timer = nil;
          }    
      }
      

      【讨论】:

        【解决方案4】:

        使 NSTimer 对象无效并重新创建的唯一方法

        【讨论】:

          【解决方案5】:

          没有直接的方法可以做到这一点。您可以通过以下方式实现这一点:

          第 1 步:创建属性来保存您的计时器、一个计数计时器和一个用于计算已用时间的计数器

          @property (nonatomic, assign) NSInteger timerCount;
          @property (nonatomic, strong) NSTimer *myCountTimer;
          @property (nonatomic, strong) NSTimer *myTimer;
          

          第 2 步:启动您的计时器,计数计时器并实现计时器处理程序:

          - (void)startTimer {
              self.myCountTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self  selector:@selector(countTimer:) userInfo:nil repeats:NO];
          
              self.myTimer = [NSTimer scheduledTimerWithTimeInterval:60.0f target:self  selector:@selector(fireTimer:) userInfo:nil repeats:NO];
          }
          
          
          - (void)countTimer:(NSTimer *)inTimer {
              self.timerCount += 1;
          }
          
          
          - (void)fireTimer:(NSTimer *)inTimer {
              // Timer is fired.
          }
          

          第 3 步:实现播放/暂停计时器:

          - (void)pauseTimer {
              [self.myTimer invalidate];
              self.myTimer = nil;
          }
          
          - (void)resumeTimer {
              if(self.myTimer) {
                  [self.myTimer invalidate];
                  self.myTimer = nil;
              }
          
              NSInteger remainingTime = 60 - self.timerCount;
          
              self.myTimer = [NSTimer scheduledTimerWithTimeInterval:remainingTime target:self  selector:@selector(fireTimer:) userInfo:nil repeats:YES];
          }
          

          【讨论】:

            【解决方案6】:

            在 Objective-C 中 声明两个全局变量为

            int time;
            NSTimer *timer;
            
            - (IBAction)start:(id)sender
             {
               timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self  selector:@selector(increaseTimer) userInfo:nil repeats:YES];
             }
            
            - (IBAction)pause:(id)sender
            {
              [timer invalidate];
            }
            - (IBAction)reset:(id)sender {
                 [timer invalidate];
                 time = 0;
                 _lbl_tmer.text=@"0";
             }
              -(void)increaseTimer {
               time++;
                NSString *str=[NSString stringWithFormat:@"%d",time];
                _lbl_tmer.text = str;
             }
            

            在斯威夫特中

            声明两个全局变量

            var timer = NSTimer()
            
            var time = 0
            

            从那时起相应地操纵它们

            @IBOutlet var timerLabel: UILabel!
            
            func increaseTimer() {
            
                time++
            
                timerLabel.text = "\(time)"
            
            }
            
            @IBAction func play(sender: AnyObject) {
            
                timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("increaseTimer"), userInfo: nil, repeats: true)
            
            }
            
            @IBAction func pause(sender: AnyObject) {
            
                timer.invalidate()
            
            }
            
            @IBAction func reset(sender: AnyObject) {
            
                timer.invalidate()
            
                time = 0
            
                timerLabel.text = "0"
            
            }
            

            编码愉快.. :)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-02-05
              • 2012-01-22
              • 1970-01-01
              • 2021-07-09
              • 1970-01-01
              • 2015-06-02
              • 1970-01-01
              相关资源
              最近更新 更多