无法使 iOS 中的计时器失效



我是编程新手,在以下方面已经卡了一段时间:

当我运行附加的代码时,一切似乎都正常,然后进度条再次开始计数。 控制台不断打印失效确认字符串,但计时器似乎一直在滚动。 我感谢您的帮助。

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize doneYet;
@synthesize cooking;
@synthesize hidebutton;
- (void)viewDidLoad;
{
    [super viewDidLoad];
    [doneYet setProgress:doneYet.progress=0.0];
    // Do any additional setup after loading the view, typically from a nib.
}
- (void)viewDidUnload
{
    [self setDoneYet:nil];
    [self setHidebutton:nil];
    [self setCooking:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
-(void)startTimer
{CurrentTimer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:Nil repeats:YES];}
-(void)timerFired
{ if (doneYet.progress<1) {
    [doneYet setProgress:doneYet.progress+0.1];
}
else if (doneYet.progress=1) 
{
    (void) [CurrentTimer invalidate];
    NSLog(@"invalidated CurrentTimer");
    hidebutton.hidden = FALSE;
    cooking.hidden = TRUE;
    [doneYet setProgress:doneYet.progress=0.0];
}
}

- (IBAction)Eggtimer:(id)sender 
{   
    [self startTimer];
    hidebutton.hidden = TRUE;
    cooking.hidden = FALSE;
    ;}    
@end 

似乎是一个问题

else if (doneYet.progress=1) 

原因有二:

  • 相等比较运算符是 == 而不是 =(这是赋值运算符(
  • 您正在比较一个float数字以获得精确值,这从来都不是好事,因为浮点数不精确,您应该检查progress >= 1.0,否则您可能会超过 1.0(例如 1.0000001(并跳过停止条件

此外,在停止条件下,您执行

[doneYet setProgress:doneYet.progress=0.0];

但以前应该是

[doneYet setProgress:0.0];

我认为你应该这样做,retain NSTimer对象。

CurrentTimer=[[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:Nil repeats:YES] retain];

您可以做的一件事是将 startTimer 更改为

-(void)startTimer
{
    [CurrentTimer invalidate];
    CurrentTimer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:Nil repeats:YES];
}

这将使旧计时器失效,并且只有一个计时器。

我的错误在于将命令 startTimer 的按钮指定为第一响应者。

很抱歉将您的时间和建议用于由于代码中没有的错误而导致的事情。

再次感谢所有提供建议的人。 这对初学者来说意义重大!

最新更新