所以這裏是我遇到的問題,我創建了兩個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];
}
我試過你的建議,但它仍然工作相同,我只是意識到它必須是關於比較的東西,因爲我有'stopDecrypt'和'stopCrack'連接到按鈕和按鈕正常工作。 inputCode.text是否返回一個可以與NSString進行比較的值,或者是否需要輸入它或什麼? – Joe 2010-09-29 19:45:34
@Joe inputCode.text返回一個NSString,所以這些值應該是可比較的。由於其中一個字符串是由用戶輸入的,「localizedCompare:'可能會更好地爲您服務。 – highlycaffeinated 2010-09-29 19:53:04