NSTimer вопросы - PullRequest
       21

NSTimer вопросы

1 голос
/ 17 июля 2011

Итак, у меня две проблемы, но обе связаны.

  1. Я создал «анимацию», которая перемещает представление прогресса при нажатии кнопки с помощью NSTimer. Эта анимация работает отлично в первые пару раз, когда нажимается кнопка, но после этого она начинает ускорять процесс, практически пропуская от начального начала цикла NSTimer до конца цикла NSTimer. Мне было интересно, слышал ли кто-нибудь об этой проблеме и / или знает решение?

  2. Я создал то же самое в вопросе 1, но в UItableViewCell, и цикл NSTimer активируется при нажатии кнопки редактирования. Кнопка редактирования активирует функцию с такими [self.tableView2 setEditing:NO animated:YES]; и NSTimer scheduledTimerWithInterval ... (анимация просмотра хода выполнения). Проблема в том, что анимация 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;
            }
        }
    }

}

Ответы [ 3 ]

0 голосов
/ 17 июля 2011

Любой таймер становится недействительным после завершения, если только он не повторяется: ДА.Если это так, вам нужно сделать его недействительным в какой-то момент, в идеале, когда все ваши условия будут выполнены.В вашем случае, я думаю, вы захотите, когда вы устанавливаете animationFlag == 0 (я полагаю, что именно тогда вы хотите, чтобы таймер прекратил срабатывать).Используйте что-то вроде этого:

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

Вы также должны поместить этот код в editTable в начале.Таким образом, если таймер работал, и кто-то запускал его снова, он сначала сбрасывался, а затем начинался снова. В противном случае у вас есть несколько таймеров, которые все запускают увеличение увеличения.Это также необходимо в любое время, когда пользователь отменяет таймер.

0 голосов
/ 19 мая 2012
  1. Возможно, вам придется отключить таймер из вашей первой анимации. Я подозреваю, что у вас работает два таймера, и поэтому скорость анимации удваивается.

  2. Это, вероятно, из-за вызова reloadData в вашем обратном вызове таймера. Таблица не может быть перезагружена и анимирована одновременно.

0 голосов
/ 17 июля 2011

Я считаю, что rgeorge верен;

Вы не избавляетесь от «myTimer», когда останавливаете анимацию.Таким образом, даже если вы больше не видите анимацию, increment все еще вызывается при увеличении.Измените метод на что-то вроде этого:

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

Затем, когда вы закончите с увеличением суммы, обязательно отключите таймер изнутри увеличения увеличения.

...