objective-c - NSTimer 问题

标签 objective-c cocoa ios4 animation nstimer

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

  1. 我创建了一个“动画”,当单击按钮时,它会移动进度 View NSTimer 。该动画在单击按钮的前几次工作正常,但之后它开始加速该过程,实际上从 NSTimer 的初始开始跳过。循环到 NSTimer 的末尾环形。我想知道是否有人听说过这个问题和/或知道解决方案?

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

这是问题 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;
            }
        }
    }

}

最佳答案

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

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

您还需要将该代码放在开头的 editTable 中。这样,如果计时器正在运行并且有人再次启动它,它会首先重置,然后再次开始。否则,您将有多个计时器都触发增加量。当用户取消计时器时您也需要它。

关于objective-c - NSTimer 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6722026/

相关文章:

ios - self.navigationController 分配为 RootViewController 后为空?

ios - Objective-C : View PDF File Link With UIWebView

xcode - MacOS 在后台不响应 MPRemoteCommandCenter 命令

iphone - 如何退出(退出)iPhone4 sdk中的应用程序

iphone - 核心数据一对多关系

ios - 从普通 View Controller 打开 ECSlidingViewController

iphone - 从网络加载 UIImage 的最常见方式

objective-c - 运行 OS X 应用几天后 EXC_BAD_INSTRUCTION (SIGILL) 崩溃

objective-c - isKindOfClass 意外返回 NO

iphone - 抓取音频