Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在加载视图控制器后使用计时器设置进度条_Ios_Objective C_Iphone_Nsdate_Nstimer - Fatal编程技术网

Ios 如何在加载视图控制器后使用计时器设置进度条

Ios 如何在加载视图控制器后使用计时器设置进度条,ios,objective-c,iphone,nsdate,nstimer,Ios,Objective C,Iphone,Nsdate,Nstimer,我在循环进度条上使用计时器,并在界面中使用了NSDate属性(在viewController中也进行了测试),但当viewController加载时,它将从27秒开始显示,而我已将其值设置为30秒 @interface TestViewController () { NSTimeInterval totalCountdownInterval; NSDate* startDate; } } -(void)viewWillAppear:(BOOL)animated{

我在循环进度条上使用计时器,并在界面中使用了NSDate属性(在viewController中也进行了测试),但当viewController加载时,它将从27秒开始显示,而我已将其值设置为30秒

@interface TestViewController ()

 {
    NSTimeInterval totalCountdownInterval;
    NSDate* startDate;
 }
}

-(void)viewWillAppear:(BOOL)animated{

    [self startTimer];
    totalCountdownInterval = 30.0;
    startDate = [NSDate date];
}

-(void)startTimer {

      if (!_timer) {
          _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(timerFired:)
                                                userInfo:nil
                                               repeats:YES];
    }
}

-(void)stopTimer {

      if ([_timer isValid]) {
          [_timer invalidate];
      }
      _timer = nil;
}

-(void)timerFired:(NSTimer *)timer {

    NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:startDate];
    NSTimeInterval remainingTime = totalCountdownInterval - elapsedTime;

    CGFloat timeRemain = remainingTime;
    NSLog(@"%f", timeRemain);
    if (remainingTime < 0.0) {
        [_timer invalidate];
    }

    [_circleProgressBar setHintTextGenerationBlock:(^NSString *(CGFloat progress) {

        if (!(timeRemain < 0.9)) {
            progress = timeRemain - 1;
            return [NSString stringWithFormat:@"%.0f", progress];
        }else{
            progress = 0;
            return [NSString stringWithFormat:@"%.0f", progress];
        }

    })];
    [_circleProgressBar setProgress:(_circleProgressBar.progress + 0.0333f) animated:YES];
}

-(void) viewWillDisappear:(BOOL)animated {
    [self stopTimer];
}
我的场景是,用户有一个问题和可选答案,他/她有一些时间,假设当他/她单击开始按钮时30秒,而在该屏幕加载后另一个屏幕打开,则开始时间应为30秒

@interface TestViewController ()

 {
    NSTimeInterval totalCountdownInterval;
    NSDate* startDate;
 }
}

-(void)viewWillAppear:(BOOL)animated{

    [self startTimer];
    totalCountdownInterval = 30.0;
    startDate = [NSDate date];
}

-(void)startTimer {

      if (!_timer) {
          _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(timerFired:)
                                                userInfo:nil
                                               repeats:YES];
    }
}

-(void)stopTimer {

      if ([_timer isValid]) {
          [_timer invalidate];
      }
      _timer = nil;
}

-(void)timerFired:(NSTimer *)timer {

    NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:startDate];
    NSTimeInterval remainingTime = totalCountdownInterval - elapsedTime;

    CGFloat timeRemain = remainingTime;
    NSLog(@"%f", timeRemain);
    if (remainingTime < 0.0) {
        [_timer invalidate];
    }

    [_circleProgressBar setHintTextGenerationBlock:(^NSString *(CGFloat progress) {

        if (!(timeRemain < 0.9)) {
            progress = timeRemain - 1;
            return [NSString stringWithFormat:@"%.0f", progress];
        }else{
            progress = 0;
            return [NSString stringWithFormat:@"%.0f", progress];
        }

    })];
    [_circleProgressBar setProgress:(_circleProgressBar.progress + 0.0333f) animated:YES];
}

-(void) viewWillDisappear:(BOOL)animated {
    [self stopTimer];
}
@接口TestViewController()
{
NSTimeInterval totalCountdownInterval;
NSDate*起始日期;
}
}
-(无效)视图将显示:(BOOL)动画{
[自我启动者];
totalCountdownInterval=30.0;
startDate=[NSDate日期];
}
-(无效)startTimer{
如果(!\u定时器){
_计时器=[NSTimer scheduledTimerWithTimeInterval:1.0f
目标:自我
选择器:@selector(timerFired:)
用户信息:无
重复:是];
}
}
-(无效)停止计时器{
如果([\u计时器有效]){
[定时器失效];
}
_定时器=零;
}
-(void)timerFired:(NSTimer*)计时器{
NSTimeInterval elapsedTime=[[NSDate-date]timeIntervalSinceDate:startDate];
NSTimeInterval remainingTime=总倒计时间隔-延时;
CGFloat TIMESTAIN=剩余时间;
NSLog(@“%f”,timeremaine);
如果(剩余时间<0.0){
[定时器失效];
}
[\u circleProgressBar setHintTextGenerationBlock:(^NSString*(CGFloat进度){
如果(!(时间保持<0.9)){
进度=时间剩余-1;
返回[NSString stringWithFormat:@“%.0f”,进度];
}否则{
进度=0;
返回[NSString stringWithFormat:@“%.0f”,进度];
}
})];
[_circleprogressbarsetprogress:(_circleProgressBar.progress+0.0333f)已设置动画:是];
}
-(无效)视图将消失:(BOOL)已设置动画{
[自动停止计时器];
}

任何帮助都将不胜感激。谢谢。

使用无效视图中出现的计时器代码,然后再试一次

- (void)viewDidAppear:(BOOL)animated
{

[self startTimer];
totalCountdownInterval = 30.0;
startDate = [NSDate date];
}

使用无效视图中出现的计时器代码,然后重试一次

- (void)viewDidAppear:(BOOL)animated
{

[self startTimer];
totalCountdownInterval = 30.0;
startDate = [NSDate date];
}

第一个计时器事件将在经过1秒后触发,因此您应该首先看到29。因此,您应该在计时器事件之外手动显示数字30

在setHintTextGenerationBlock中的代码中减去1: 进度=时间剩余-1; 这将使您看到28作为首字母

最后,你应该在ViewDidDisplay中启动计时器,而不是在ViewWillDisplay中启动计时器,在这里你又损失了一秒,到了27秒

要更正代码,请执行以下操作:

@interface TestViewController ()

 {
    NSTimeInterval totalCountdownInterval;
    NSDate* startDate;
 }
}

-(void)viewDidLoad {
    [_circleProgressBar setHintTextGenerationBlock:(^NSString *(CGFloat progress) {

        return [NSString stringWithFormat:@"%.0f", progress * 30];

    })];
    [_circleProgressBar setProgress:1.0) animated:NO];
}

-(void)viewDidAppear:(BOOL)animated{

    [self startTimer];
    totalCountdownInterval = 30.0;
    startDate = [NSDate date];
}

-(void)startTimer {

      if (!_timer) {
          _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(timerFired:)
                                                userInfo:nil
                                               repeats:YES];
    }
}

-(void)stopTimer {

      if ([_timer isValid]) {
          [_timer invalidate];
      }
      _timer = nil;
}

-(void)timerFired:(NSTimer *)timer {

    NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:startDate];
    NSTimeInterval remainingTime = totalCountdownInterval - elapsedTime;

    CGFloat timeRemain = remainingTime;
    NSLog(@"%f", timeRemain);
    if (remainingTime < 0.0) {
        [_timer invalidate];
    }

    [_circleProgressBar setProgress:(1.0 * timeRemain / 30.0) animated:YES];
}

-(void) viewWillDisappear:(BOOL)animated {
    [self stopTimer];
}
@接口TestViewController()
{
NSTimeInterval totalCountdownInterval;
NSDate*起始日期;
}
}
-(无效)viewDidLoad{
[\u circleProgressBar setHintTextGenerationBlock:(^NSString*(CGFloat进度){
返回[NSString stringWithFormat:@“%.0f”,进度*30];
})];
[_circleProgressBar设置进度:1.0)动画:否];
}
-(无效)视图显示:(BOOL)动画{
[自我启动者];
totalCountdownInterval=30.0;
startDate=[NSDate日期];
}
-(无效)startTimer{
如果(!\u定时器){
_计时器=[NSTimer scheduledTimerWithTimeInterval:1.0f
目标:自我
选择器:@selector(timerFired:)
用户信息:无
重复:是];
}
}
-(无效)停止计时器{
如果([\u计时器有效]){
[定时器失效];
}
_定时器=零;
}
-(void)timerFired:(NSTimer*)计时器{
NSTimeInterval elapsedTime=[[NSDate-date]timeIntervalSinceDate:startDate];
NSTimeInterval remainingTime=总倒计时间隔-延时;
CGFloat TIMESTAIN=剩余时间;
NSLog(@“%f”,timeremaine);
如果(剩余时间<0.0){
[定时器失效];
}
[_circleProgressBar设置进度:(1.0*时间保持/30.0)动画:是];
}
-(无效)视图将消失:(BOOL)已设置动画{
[自动停止计时器];
}
您应该在开始时将进度设置为1.0,然后分30步倒计时到0.0。
设置提示生成块以将对1.0-0.0有意义的内容显示为30-0。

第一个计时器事件将在经过1秒后触发,因此您应该首先看到29。因此,您应该在计时器事件之外手动显示数字30

在setHintTextGenerationBlock中的代码中减去1: 进度=时间剩余-1; 这将使您看到28作为首字母

最后,你应该在ViewDidDisplay中启动计时器,而不是在ViewWillDisplay中启动计时器,在这里你又损失了一秒,到了27秒

要更正代码,请执行以下操作:

@interface TestViewController ()

 {
    NSTimeInterval totalCountdownInterval;
    NSDate* startDate;
 }
}

-(void)viewDidLoad {
    [_circleProgressBar setHintTextGenerationBlock:(^NSString *(CGFloat progress) {

        return [NSString stringWithFormat:@"%.0f", progress * 30];

    })];
    [_circleProgressBar setProgress:1.0) animated:NO];
}

-(void)viewDidAppear:(BOOL)animated{

    [self startTimer];
    totalCountdownInterval = 30.0;
    startDate = [NSDate date];
}

-(void)startTimer {

      if (!_timer) {
          _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(timerFired:)
                                                userInfo:nil
                                               repeats:YES];
    }
}

-(void)stopTimer {

      if ([_timer isValid]) {
          [_timer invalidate];
      }
      _timer = nil;
}

-(void)timerFired:(NSTimer *)timer {

    NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:startDate];
    NSTimeInterval remainingTime = totalCountdownInterval - elapsedTime;

    CGFloat timeRemain = remainingTime;
    NSLog(@"%f", timeRemain);
    if (remainingTime < 0.0) {
        [_timer invalidate];
    }

    [_circleProgressBar setProgress:(1.0 * timeRemain / 30.0) animated:YES];
}

-(void) viewWillDisappear:(BOOL)animated {
    [self stopTimer];
}
@接口TestViewController()
{
NSTimeInterval totalCountdownInterval;
NSDate*起始日期;
}
}
-(无效)viewDidLoad{
[\u circleProgressBar setHintTextGenerationBlock:(^NSString*(CGFloat进度){
返回[NSString stringWithFormat:@“%.0f”,进度*30];
})];
[_circleProgressBar设置进度:1.0)动画:否];
}
-(无效)视图显示:(BOOL)动画{
[自我启动者];
totalCountdownInterval=30.0;
startDate=[NSDate日期];
}
-(无效)startTimer{
如果(!\u定时器){
_计时器=[NSTimer scheduledTimerWithTimeInterval:1.0f
目标:自我
选择器:@selector(timerFired:)
用户信息:无
重复:是];
}
}
-(无效)停止计时器{
如果([\u计时器有效]){
[定时器失效];
}
_定时器=零;
}
-(void)timerFired:(NSTimer*)计时器{
NSTimeInterval elapsedTime=[[NSDate-date]timeIntervalSinceDate:startDate];
NSTimeInterval remainingTime=totalCo