1

嗨,我正在尝试在我的 iPhone 应用程序中显示一个自定义进度条,因为我正在编写一种方法来增加进度条值,一旦它的值变为 100%,那么我需要使我的计时器无效,我需要停止这个递归并显示下一个 viewController。我的代码片段如下所示,

-(void)progressNextValue
{
    progressValue += 1.0f;
    if(progressValue >= progress.maxValue){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"end" message:@"TimeOut!!!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
        NSLog(@"Time Out!!!!");
        [mytimer invalidate];
        Second *sec = [[Second alloc] initWithNibName:@"Second" bundle:nil];
        [self.view addSubview:sec.view];    
    }

    progress.currentValue = progressValue;
    mytimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(progressNextValue) userInfo:nil repeats:YES];

}

- (void)viewDidLoad
{
    [super viewDidLoad];
    progress.maxValue = 100.0f;    
    [self progressNextValue];
}

在这里,即使我的progressValue = progress.maxValue,mytimer没有失效。

提前感谢任何帮助。

4

4 回答 4

2

此代码导致问题,

mytimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(progressNextValue) userInfo:nil repeats:YES];

每次您使用repeat创建计时器时,这就是问题所在。

从任何其他方法调用该progressNextValue方法:

-(void)tempMethod

    mytimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(progressNextValue) userInfo:nil repeats:YES];
}

或者只是从以下位置调用它:

- (void)viewDidLoad
{
    [super viewDidLoad];
    progress.maxValue = 100.0f;    
    mytimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(progressNextValue) userInfo:nil repeats:YES];
}
于 2012-07-11T13:15:04.313 回答
2

无论如何,每次运行该方法时,您都在设置计时器。添加 return 语句,或将计时器实例化放在 else 语句中。

例如:

-(void)progressNextValue
{
    progressValue += 1.0f;
    if(progressValue >= progress.maxValue){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"end" message:@"TimeOut!!!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
        NSLog(@"Time Out!!!!");
        [mytimer invalidate];
        Second *sec = [[Second alloc] initWithNibName:@"Second" bundle:nil];
        [self.view addSubview:sec.view];    
    } else {
        // Move this line inside the else statements so that it only gets run if 
        // the progress bar is not full.
        mytimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(progressNextValue) userInfo:nil repeats:YES];
    }

    progress.currentValue = progressValue;
}
于 2012-07-11T13:20:42.677 回答
0

为了使您的计时器无效,您需要调用[myTimer invalidate]. 你做什么。但myTimer在你的情况下,据我所知没有保留。所以retain当你分配它时它和release当你使它无效时它。

希望这可以帮助。

干杯!

于 2012-07-11T13:19:27.747 回答
0

与其在内部调用计时器progressNextValue,不如在viewDidLoad(或您想要启动它的其他地方)调用它。保留对您的计时器的引用(因此在页面顶部放置NSTimer *t),然后在满足您的条件时执行[t invalidate]

问题是,当您在“progressNextValue”中调用计时器时,您是在告诉它重复,因此使计时器无效并没有多大作用(因为您有多个计时器在运行)。

于 2012-07-11T13:20:15.763 回答