Ios 如何在加载视图控制器后使用计时器设置进度条
我在循环进度条上使用计时器,并在界面中使用了NSDate属性(在viewController中也进行了测试),但当viewController加载时,它将从27秒开始显示,而我已将其值设置为30秒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{
@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