当我更改视图控制器时,NSTimer会自动增加

时间:2013-11-18 14:30:57

标签: ios uiviewcontroller nstimer parse-platform

在我的viewController中,我插入了一个计时器,用于计算直接从我的Parse.com数据库中获取的数字。

计时器工作正常,插入到viewDidAppear和ViewDidDisappear中,以便在更改视图控制器时锁定序列。

我遇到的问题是,当我使用Push更改视图控制器时,计时器不会停止,您举个例子:

我打开应用程序并使用NSTimer的动画正确完成计算。

更改视图,然后我返回后退按钮查看此时计时器的位置我看到每次更改视图并返回时数字contiunano都会增加...

你能解释我错在哪里吗?

-(void)viewDidAppear:(BOOL)animated {
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new]forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.shadowImage = [UIImage new];
    [self.navigationController.navigationBar setBackgroundColor:[UIColor clearColor]];
    self.title = NSLocalizedString(@"", nil);
    [self animatelayertopoint:0];
    [self AnimationMenuView:600];
    [self QueryForViewPrincipal];
    [self QueryForCollectionView];
    [self ShowBadgeNumber];
    [self Timer];
    [collectionView reloadData];

}
-(void)Timer{

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

}

-(void) CalcoloMediadiLaurea{
    PFUser *CurrentUser = [PFUser currentUser];
    NSNumber *NumeroUndici = [NSNumber numberWithInt:11];
    NSNumber *NumeroTre = [NSNumber numberWithInt:3];
    NSNumber *ValoreMediaPonderata = [CurrentUser objectForKey:FF_USER_MEDIA_PONDERATA];
    int FFValoreTre = [NumeroTre intValue];
    int FFValoreUndici = [NumeroUndici intValue];
    double MediaPonderata = [ValoreMediaPonderata doubleValue];
    double RisultatoMoltiplicazioneValoriPonderataUndici;
    RisultatoMoltiplicazioneValoriPonderataUndici = MediaPonderata * FFValoreUndici;
    double RisultatoMediaLaurea;
    RisultatoMediaLaurea = RisultatoMoltiplicazioneValoriPonderataUndici / FFValoreTre;
    CalcoloMediaLaureaLabel.text = [NSString stringWithFormat:@"%.1f", FFTickValoreMediaLaurea ];
    FFTickValoreMediaLaurea++;

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

   }

-(void)viewDidDisappear:(BOOL)animated {
    [self animatelayertopoint:0];
    [self AnimationMenuView:600];
    [self CalcoloMediadiLaurea];
    }

3 个答案:

答案 0 :(得分:1)

在视图上再次重新安排的计时器确实出现而没有使前一个计时器无效。你应该在.h中创建计时器的实例然后在其中保存计时器的参考。当你计划计时器时,确实出现了视图只是使其无效,然后再次安排它。

    if([self.timer isValid])
{

    [self.timer invalidate];
    self.timer=nil;

    self.timer=[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(CalcoloMediadiLaurea:) userInfo:nil repeats:YES];

}

答案 1 :(得分:1)

这对我有用,这与上述答案一致,但有点明确说明。

- (void)viewWillAppear:(BOOL)animated
{
    NSTimeInterval secondsBetween = [endDate timeIntervalSinceDate:currentTime];
    secondsLeft = secondsBetween;
    [self countdownTimer];
}

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


//Initiates timer

- (void)countdownTimer
{
    [self.timer invalidate];
    self.timer = nil;
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES];
}

答案 2 :(得分:0)

这是因为您正在创建新的计时器而不会使旧的计时器失效。定时器不会自动失效,您必须自己完成。因此,如果你进入第二个视图并在无效条件为真之前返回,你将创建新的计时器并有两个:)......等等。