2012-09-19 74 views
1

好吧,我想創建多個定時器,所有的定時器都在不同的時間開始(25,50,1分鐘,1分30秒...)但我不知道如何使它停止當它達到0並且它達到零時,將「播放器」帶到另一個視圖。我如何在xcode 4.5中創建一個倒數計時器

繼承人我.h文件中

@interface ViewController :UIViewController { 

IBOutlet UILabel *seconds; 

NSTimer *timer; 

int MainInt; 
} 

@end 

而且我的繼承人.m文件

@implementation ViewController 

-(void)countDownDuration { 

MainInt -= 1; 

seconds.text = [NSString stringWithFormat:@"%i", MainInt]; 

} 

-(IBAction)start:(id)sender { 

MainInt = 25; 

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 

             target:self 
             selector:@selector(countDownDuration) 
             userInfo:nil 
             repeats:YES]; 
} 

@end 

回答

5

的NSTimer並沒有這樣做自動,但它的瑣碎把它添加到您的countDownDuration方法。例如:

-(void)countDownDuration { 
    MainInt -= 1; 
    seconds.text = [NSString stringWithFormat:@"%i", MainInt]; 
    if (MainInt <= 0) { 
    [timer invalidate]; 
    [self bringThePlayerToAnotherView]; 
    } 
} 

當然,您要創建多個定時器。你可以將每個存儲在不同的變量中,併爲每個變量賦予不同的選擇器。但是,如果您查看NSTimer的文檔,回調方法實際上將定時器對象作爲選擇器;你無視它,但你不應該。

與此同時,您可以將任何類型的對象存儲爲計時器的userInfo,因此這是存儲每個計時器的單獨當前倒計時值的好地方。

所以,你可以做這樣的事情:

-(void)countDownDuration:(NSTimer *)timer { 
    int countdown = [[timer userInfo] reduceCountdown]; 
    seconds.text = [NSString stringWithFormat:@"%i", countdown]; 
    if (countdown <= 0) { 
    [timer invalidate]; 
    [self bringThePlayerToAnotherView]; 
    } 
} 

-(IBAction)start:(id)sender { 
    id userInfo = [[MyCountdownClass alloc] initWithCountdown:25]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
             selector:@selector(countDownDuration:) 
             userInfo:userInfo 
              repeats:YES]; 
} 

我留下了一些細節不成文的(像MyCountdownClass定義哪位必須包括方法initWithCountdown:reduceCountdown是做正確的事),但他們應該都很簡單。 (另外,大概你想要一個存儲更多倒數值的userInfo,例如,如果每個定時器都將播放器發送到不同的視圖,那麼你也必須在那裏隱藏視圖。)

PS,notice你現在需要@selector(countDownDuration:)。 ObjC的新手一直在搞這個。 countDownDuration:countDownDuration是完全不相關的選擇器。

PPS,MyCountdownClass的完整定義必須在countDownDuration:中可見(除非您有其他類具有相同的選擇器)。您可能想明確地將userInfo的結果轉換爲MyCountdownClass *以使事情更清楚。

+0

我在int countdown = [[timer userInfo] reduceCountdown]下得到這個錯誤;沒有已知的實例方法選擇器'reduceCountdown' –

+0

嗯,是的,當你定義你的'MyCountdownClass'時,你必須給它一個'reduceCountdown'方法,否則你將無法對它調用'reduceCountdown'。對不起,沒有更明確的說法;我會編輯答案。 – abarnert

相關問題