2011-07-17 4 views
1

그래서 두 가지 문제가 있지만 둘 다 관련이 있습니다. NSTimer 질문

  1. 는 I는 NSTimer 버튼을 이용하여 클릭하면 진행 뷰를 이동시키는 "애니메이션"를 만들었다. 이 애니메이션은 버튼을 처음 두 번 클릭해도 괜찮 으면 작동하지만 그 후에는 NSTimer 루프의 처음 시작부터 NSTimer 루프의 끝까지 건너 뛰면서 프로세스의 속도를 높이기 시작합니다. 나는 누군가가이 문제점에 대해 들어 본 적이 있고 해결책을 알고 있는지 궁금해하고 있었다.

  2. 질문 1에서 같은 것을 만들었지 만 UItableViewCell에 편집 버튼을 누르면 루프가 활성화됩니다. 편집 버튼은 [self.tableView2 setEditing:NO animated:YES];NSTimerscheduledTimerWithInterval ... (진행보기 애니메이션) 기능을 활성화합니다. 여기서 문제는 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; 
      } 
     } 
    } 

} 
+2

꼭 코드를 입력하십시오. 이러한 행동을 보여주고 공유하는 가장 작은 청크를 격리하십시오. 1. 후속 클릭이 이전 버튼을 취소하지 않고 버튼을 이동하는 데 더 많은 타이머를 만드는 것처럼 들립니다. 또는 타이머가 클릭 사이에 재설정되지 않는 일부 상태를 사용 중입니다 (예를 들어, 여유롭게 들어가는 가속화 요인이 있고 재설정하지 못하는 경우).) 2. 덜 확신 ... 애니메이션 트랜잭션을 관리하기위한 UIView 클래스 메서드를 호출하고 있습니까? – rgeorge

답변

-1

저는 rgeorge가 정확하다고 믿습니다.

애니메이션을 중단해도 "myTimer"가 삭제되지 않습니다. 따라서 애니메이션을 더 이상 볼 수는 없지만 increaseAmount는 계속해서 반복해서 호출됩니다. 이 같은 뭔가 방법을 변경합니다

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

그런 다음, 당신이 증가 금액을 완료하면, increaseAmount 내에서 타이머를 해제해야합니다.

0

모든 타이머는 반복이 없으면 끝나면 무효화됩니다 : 예. 그렇다면 어떤 시점에서 스스로 무효화해야하며 모든 조건이 충족되는 것이 이상적입니다. 귀하의 경우에는 animationFlag == 0 (나는 타이머가 발사를 멈추길 원할 때)을 설정할 때 그것을 원할 것이라고 생각한다. 다음과 같이 사용하십시오 :

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

또한 편집 태그의 시작 부분에 코드를 삽입해야합니다. 그런 식으로 타이머가 작동 중이고 다른 사람이 그것을 다시 시작하면 처음에 다시 설정 한 다음 다시 시작합니다. 그렇지 않으면 여러 타이머가 모두 증가합니다. 또한 사용자가 타이머를 취소 할 때마다 필요합니다.

+0

첫 번째 질문에 대한 해결책 인 것 같았지만 두 번째 질문에 대한 답을 찾고 있습니다. 어떤 도움이라도 대단히 감사 할 것입니다. –

0
  1. 아마도 첫 번째 애니메이션에서 타이머를 무효화해야 할 것입니다. 나는 두 개의 타이머가 작동하고 따라서 애니메이션의 속도가 두 배가되었다고 생각합니다.

  2. 이는 아마도 타이머 콜백에서 reloadData 호출로 인한 것일 수 있습니다. tableview는 동시에 다시로드 및 애니메이션을 적용 할 수 없습니다.