2010-09-29 38 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對象中刪除 定時器的唯一途徑。