NSTimer的问题

时间:2011-07-17 05:05:46

标签: objective-c cocoa ios4 animation nstimer

所以我有两个问题但两者都有关系。

  1. 我创建了一个“动画”,可以在使用NSTimer单击按钮时移动进度视图。这个动画在按下单击按钮的前几次工作正常但在此之后开始加速该过程,实际上从NSTimer循环的初始跳转到NSTimer循环的结束。我想知道是否有人听说过这个问题和/或知道解决方案?

  2. 我在问题1中创建了相同的内容,但是在UItableViewCell中,当按下编辑按钮时,NSTimer循环被激活。编辑按钮激活具有此[self.tableView2 setEditing:NO animated:YES];NSTimer scheduledTimerWithInterval ...(进度视图动画)的函数。这里的问题是它的setEdit动画不再动画它只是弹出到位。再一次,有没有人知道这方面的解决方案?

  3. 以下是问题2的代码(两个问题的代码都非常相似,所以如果你能在这里发现问题,那么很可能我可以使用该解决方案来修复它们):

    -(void)editTable{
        [self.tableView2 setEditing:YES  animated:YES];
        iCount = 8;
        iCount2 = 257;
        forwardProgress = YES;
        animationFlag = YES;
        myTimer = [NSTimer scheduledTimerWithTimeInterval:0.001f target:self selector:@selector(increaseAmount) userInfo:nil repeats:YES];
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(cancelEdit)];
    }
    
    -(void)cancelEdit{
        [self.tableView2 setEditing:NO  animated:YES];
        forwardProgress = NO;
        animationFlag = YES;
        iCount = 38;
        iCount2 = 227;
        myTimer = [NSTimer scheduledTimerWithTimeInterval:0.001f target:self selector:@selector(increaseAmount) userInfo:nil repeats:YES];
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editTable)];
    }
    
    -(void)increaseAmount{
        float max = 38.0f;
        float max2 = 257.0f;
        float min2 = 227.0f;
        float min = 8.0f;
        if (animationFlag == YES) {
            if (forwardProgress == YES) {
                if (iCount <= max) {
                    iCount++;
                    // NSLog(@"iCount = %i", iCount);
                }
                if (iCount2 >= min2) {
                    iCount2--;
                    // NSLog(@"iCount2 = %i", iCount2);
                }
                if (iCount <= max) {
                    [tableView2 reloadData];
                }
                if (iCount2 >= min2) {
                    [tableView2 reloadData];
                }
                if (iCount == max) {
                     animationFlag = NO;
                }
                newFrame  = CGRectMake(iCount, 33.0f, iCount2, 11.0f);
                [tableView2 reloadData];
            }else{
                if (iCount >= min) {
                   iCount--;
                   NSLog(@"iCount = %i", iCount);
                }
                if (iCount2 <= max2) {
                    iCount2++;
                    NSLog(@"iCount2 = %i", iCount2);
                }
                newFrame = CGRectMake(iCount, 33.0f, iCount2, 11.0f);
    
                if (iCount >= min) {
                    [tableView2 reloadData];
                }
                if (iCount2 <= max2) {
                    [tableView2 reloadData];
                }
                if (iCount == min) {
                    animationFlag = NO;
                }
            }
        }
    
    }
    

3 个答案:

答案 0 :(得分:0)

任何计时器在完成后自动失效,除非它有重复:是。如果是这种情况,您需要在某些时候自己使其失效,理想情况是满足您的所有条件。在你的情况下,我认为当你设置animationFlag == 0时我会想要它(我假设你想让计时器停止射击时)。使用这样的东西:

 if ([myTimer isValid]) {
    [myTimer invalidate];
    myTimer = nil;

您还需要在开始时将该代码放在editTable中。这样,如果计时器正在运行并且有人再次启动它,它将首先重置,然后重新开始。否则,您有多个计时器全部触发increaseAmount。您也可以在用户取消计时器时随时使用它。

答案 1 :(得分:0)

  1. 您可能必须使第一个动画中的计时器无效。我怀疑你有两个计时器在运行,因此动画的速度加倍。

  2. 这可能是因为您的计时器回调中的reloadData调用。 tableview无法同时重新加载和动画。

答案 2 :(得分:-1)

我相信rgeorge是正确的;

停止动画时,你没有摆脱“myTimer”。因此,即使您可能不再看到动画,仍然会一遍又一遍地调用increaseAmount。将方法更改为以下内容:

-(void)increaseAmount:(NSTimer*)Timer;

然后,当您完成增加量时,请务必从increaseAmount中关闭计时器。