首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTimer问题

NSTimer问题
EN

Stack Overflow用户
提问于 2011-07-17 05:05:46
回答 3查看 419关注 0票数 1

所以我有两个问题,但两者都是相关的。

  1. 我创建了一个“动画”,在使用NSTimer单击按钮时移动进度视图。在点击按钮的前几次,这个动画工作得很好,但是之后它开始加速这个过程,实际上是从NSTimer循环的初始开始跳到NSTimer循环的末尾。我想知道是否有人听说过这个问题并且/或知道一个解决方案?

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

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

代码语言:javascript
复制
-(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;
            }
        }
    }

}
EN

回答 3

Stack Overflow用户

发布于 2011-07-17 18:36:21

任何计时器完成后都会使自己失效,除非它有重复:是的。如果是这样的话,您需要自己在某个时候使其失效,最好是在满足所有条件的情况下。在您的情况下,我认为当您设置animationFlag == 0时,您会想要它(我想这就是您希望计时器停止触发的时候)。使用这样的东西:

代码语言:javascript
复制
 if ([myTimer isValid]) {
    [myTimer invalidate];
    myTimer = nil;

您还需要在开始时将代码放在editTable中。这样,如果一个计时器正在运行,并且有人再次启动它,它将首先重置,然后开始again.Otherwise,您有多个定时器都会触发increaseAmount。当用户取消计时器时,您也需要它。

票数 0
EN

Stack Overflow用户

发布于 2012-05-18 20:08:49

  1. ,您可能必须使第一个动画中的计时器失效。我怀疑您有两个定时器在运行,因此动画的速度翻了一番。
  2. ,这可能是因为您的计时器回调中的reloadData调用。表视图不能同时重新加载和动画。
票数 0
EN

Stack Overflow用户

发布于 2011-07-17 07:37:26

我相信rgeorge是正确的;

当你停止你的动画时,你不会摆脱"myTimer“。因此,即使您可能不再看到动画,increaseAmount仍然是一遍又一遍地被调用。将方法更改为如下所示:

代码语言:javascript
复制
-(void)increaseAmount:(NSTimer*)Timer;

然后,当您完成增加的数量,确保关闭定时器从内部的increaseAmount。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6722026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档