2010-09-29 73 views
0

所以这里是我遇到的问题,我创建了两个NSTimer对象,当我按下按钮时它们被触发。那么用户有20秒钟的时间按下另一个按钮,强制一个警报弹出他们输入验证码的地方,当他们按下警报上的确认按钮时,它应该停止定时器。发生了什么事情是,一切正常,直到他们按下确认,而不是定时器停止它挂了一秒钟(这是我认为是由键盘解除动画引起的延迟),然后定时器继续。任何帮助将不胜感激,这里是所有相关代码:NSTimer不会失效或正在消除

#import "hackergameViewController.h" 
#import <AudioToolbox/AudioToolbox.h> 


@implementation hackergameViewController 

@synthesize decryptLabel, crackLabel, decryptButton, crackButton, submit, numberToDecrypt, numberToCrack, stopDecryptButton, stopCrackButton, inputCode; 
@synthesize soundFileURLRefBeep; 
@synthesize soundFileURLRefBuzz; 
@synthesize soundFileObjectBeep; 
@synthesize soundFileObjectBuzz; 


NSTimer *decryptTimer; 
NSTimer *crackTimer; 
int crackTime; 
int decryptTime; 
NSString *codeToConfirm; 

#pragma mark UIAlertView 
- (void)confirm:(UIAlertView *)confirm clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if(buttonIndex == 0){ 
     [confirm dismissWithClickedButtonIndex:0 animated:YES]; 
    } 
    else { 
      if (inputCode.text == codeToConfirm) { 
      [self stopCrack]; 
      [self stopDecrypt]; 
     } 
    } 
} 

-(void) generateDecryptionCode{ 
    codeToConfirm = [NSString stringWithFormat:@"%i%i%i%i%i%i", arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10]; 
    numberToDecrypt.text = codeToConfirm; 
} 

-(void) generateCrackCode{ 
    codeToConfirm = [NSString stringWithFormat:@"%i%i%i%i%i%i%i%i%i%i", arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10,arc4random() % 10]; 
    numberToCrack.text = codeToConfirm; 
} 

- (void)dealloc { 
    [decryptLabel release]; 
    [decryptButton release]; 
    [crackLabel release]; 
    [crackButton release]; 
    [submit release]; 
    [numberToCrack release]; 
    [numberToDecrypt release]; 
    [super dealloc]; 
} 

- (void) confirmCode{ 
    UIAlertView *confirm = [[UIAlertView alloc] initWithTitle:@"Confirm Code" message:@"Please Input The Correct Code:" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Confirm Code", nil]; 
    inputCode = [[UITextField alloc] initWithFrame:CGRectMake(12, 45, 260, 25)]; 
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0, 60); 
    [confirm setTransform:myTransform]; 
    [inputCode setBackgroundColor:[UIColor whiteColor]]; 
    [confirm addSubview:inputCode]; 
    [confirm show]; 
    [confirm release]; 
    [inputCode release]; 

} 


- (void) decryptTimerFires{ 

    if(decryptTime > 0){ 
     decryptTime--; 
     decryptLabel.text = [NSString stringWithFormat:@"%g", (float)decryptTime/10]; 
     if(decryptTime%10 == 0){ 
      AudioServicesPlaySystemSound (self.soundFileObjectBeep); 
     } 

    } 
    else{ 
     [decryptTimer release]; 
     decryptTimer = nil; 
    } 
} 
- (void) crackTimerFires{ 

    if(crackTime > 0){ 

     crackTime--; 
     crackLabel.text = [NSString stringWithFormat:@"%g", (float)crackTime/10]; 
     if(crackTime%10 == 0){ 
      AudioServicesPlaySystemSound (self.soundFileObjectBeep); 
     } 
     else if(crackTime == 0){ 
      AudioServicesPlaySystemSound (self.soundFileObjectBuzz); 
     } 
    } 
    else{ 
     [crackTimer release]; 
     crackTimer = nil; 
    } 
} 

-(void) stopDecrypt{ 
    [decryptTimer invalidate]; 
    [decryptTimer release]; 
    decryptTimer = nil; 
} 
-(void) stopCrack{ 
    [crackTimer invalidate]; 
    [crackTimer release]; 
    crackTimer = nil; 
} 

-(IBAction)decrypt{ 
    [self generateDecryptionCode]; 
    decryptTime = 200; 
    decryptTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(decryptTimerFires) userInfo:nil repeats:YES]; 
    [decryptTimer fire]; 

} 

-(IBAction)crack{ 
    [self generateCrackCode]; 
    crackTime = 200; 
    crackTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(crackTimerFires) userInfo:nil repeats:YES]; 
    [crackTimer fire]; 

} 

回答

0

在您的确认方法中,您确定inputCode.text == codeToConfirm返回true吗?您是否尝试过使用[inputCode.text compare:codeToConfirm]?从我所看到的情况来看,您的计时器只会在stopCrackstopDecrypt之间失效,只有在比较成功的情况下才会被调用。

+0

我试过你的建议,但它仍然工作相同,我只是意识到它必须是关于比较的东西,因为我有'stopDecrypt'和'stopCrack'连接到按钮和按钮正常工作。 inputCode.text是否返回一个可以与NSString进行比较的值,或者是否需要输入它或什么? – Joe 2010-09-29 19:45:34

+0

@Joe inputCode.text返回一个NSString,所以这些值应该是可比较的。由于其中一个字符串是由用户输入的,“localizedCompare:'可能会更好地为您服务。 – highlycaffeinated 2010-09-29 19:53:04

0

首先,你不应该叫“火”手动除非你想计时器立即开火。

其次,你应该叫-invalidate而不是-release(如你在你的-decryptTimerFires和-crackTimerFires方法做的),当你希望你的计时器走开,然后它作为你做。您正在使用+ scheduled ...类方法,该方法在当前运行循环中调度定时器(它保留了它,所以不是由您来释放它)。 -invalidate正确地将它从运行循环中删除。

从文档:

此方法是从一个NSRunLoop对象中删除 定时器的唯一途径。